当前位置: 首页 > news >正文

CF246E bfs 序上莫队

来篇莫队,支持正义根号。

发现是数颜色,这不是我们莫队的经典题目吗,所以考虑莫队。

发现 \(k\) 级儿子挺好,这给出了两个性质,分别在 bfs 序和 dfs 序上。

  1. bfs 序上,同一子树内深度相同的点相邻。
  2. dfs 序上,可以把子树问题拍成区间问题。

你就把树拍成 dfs 序再拍成 bfs 序,借助 dfs 序的帮助在子树区间内查询深度为某值的点的 bfs 序的区间,然后你就把这个问题转化为了完全的区间问题。

然后就可以美美的跑莫队了!!!

总复杂度 \(O(n\sqrt m)\)

话说跑主席树是不是 \(O(m\log n)\) 来着……

code:

// code by 樓影沫瞬_Hz17
#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10, B = 340;int n, m;int nxt[N * 2], hd[N], to[N * 2], cne;inline void add(int u, int v) { nxt[++ cne] = hd[u], to[cne] = v, hd[u] = cne; }int id_dfs, id_bfs;
int dfn[N], dep[N], sz[N], rdfn[N];
inline void dfs(int u, int f) { // 拍成 dfs 序dfn[u] = ++ id_dfs, sz[u] = 1;rdfn[id_dfs] = u;dep[u] = dep[f] + 1;for(int i = hd[u]; i; i = nxt[i]) {int v = to[i];dfs(v, u);sz[u] += sz[v];}
}int bfn[N];
inline void bfs() { // 拍成 bfs 序queue<int> q; q.push(0);while(!q.empty()) {int u = q.front(); q.pop();bfn[u] = ++ id_bfs;for(int i = hd[u]; i; i = nxt[i]) q.push(to[i]);} 
} struct Que {int l, r, id;
} q[N];
int Q, ans[N], pos[N];int a[N], b[N];
int cnt[N], sum;vector<int> st[N];
inline void calc_query() { // 处理询问for(int i = 1; i <= n + 1; i ++) st[dep[rdfn[i]]].push_back(i);for(int i = 1, v, k; i <= m; i ++) {cin >> v >> k;int l1 = dfn[v], r1 = dfn[v] + sz[v] - 1;auto itl = (lower_bound(st[dep[v] + k].begin(), st[dep[v] + k].end(), l1));auto itr = (upper_bound(st[dep[v] + k].begin(), st[dep[v] + k].end(), r1) - 1);if(itl == st[dep[v] + k].end() || itr < st[dep[v] + k].begin() || *itl > *itr) {ans[i] = 0;continue;}int l = *itl, r = *itr;l = rdfn[l];r = rdfn[r];l = bfn[l];r = bfn[r];q[++ Q] = {l, r, i};}for(int i = 1; i <= n; i ++) b[bfn[i]] = a[i]; 
}map<string, int> mp;
int cntn;int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n;int rt = 0;string s;for(int i = 1, f; i <= n; i ++) {cin >> s >> f;add(f, i);if(!mp[s]) mp[s] = ++ cntn;a[i] = mp[s];}dfs(rt, rt);bfs();cin >> m;calc_query();for(int i = 1; i <= n; i ++) pos[i] = (i - 1) / B + 1;sort(q + 1, q + 1 + Q, [pos](Que a, Que b) { return pos[a.l] == pos[b.l] ? pos[a.l] & 1 ? a.r < b.r : a.r > b.r : pos[a.l] < pos[b.l]; });for(int i = 1, l = 1, r = 0; i <= Q; i ++) {while(l < q[i].l) sum -= !-- cnt[b[l ++]];while(l > q[i].l) sum += !cnt[b[-- l]] ++;while(r < q[i].r) sum += !cnt[b[++ r]] ++;while(r > q[i].r) sum -= !-- cnt[b[r --]];ans[q[i].id] = sum;}for(int i = 1; i <= m; i ++) cout << ans[i] << '\n';return 0;
}
http://www.jsqmd.com/news/46721/

相关文章:

  • 2025 年 11 月降本增效管理咨询公司推荐排行榜,降本增效咨询,企业降本增效,提质增效咨询机构,专业实力与客户满意度深度解析
  • 小型食品厂省心了!CLC-S22R 控温又省成本​
  • 质量基石:读懂检查表,用好数字化管理利器
  • P4148 简单题 模板题分析
  • 【压测数据分享】VictoriaLogs 中的参数 `inmemoryDataFlushInterval` 对写入性能的影响
  • Windows系统增强神器!PowerToys微软官方效率工具(实操v教程)!
  • Linux内核实验-ubuntu
  • 2025年11月四川自习室加盟市场分析与品牌推荐
  • 2025年电极生产厂家权威推荐榜单:航空插头/马达壳/插针源头厂家精选
  • 2025 最新推荐装盒机厂家权威排行榜:全自动 / 食品 / 纸巾 / 卫生巾装盒机技术创新与整线配套能力测评
  • P9433 [NAPC-#1] Stage5 - Conveyors 分析
  • 我发现上大学虚构痛苦是件非常愚蠢的事
  • Qt 实现“可点击跳转”的 QSlider
  • 技术架构进化论:从“独栋别墅”到“智慧城市”
  • STM32项目分享:基于STM32的酒店送餐小车的设计与搭建
  • 2025 年最新推荐套袋机厂家权威榜单:聚焦技术创新与专利优势,覆盖多品类设备选型指南M 型袋套袋机/预制袋套袋机/袋中袋套袋机/食品套袋机/八边封套袋机公司推荐
  • Galera Cluster部署 - 详解
  • 模拟机问题
  • UBUNTU22.04,配置wine中调用cuda
  • macos制作可以启动的iso引导文件
  • MySQL 8.0.12 时区设置和修改
  • 676
  • 2025年主流学习机品牌差异化分析与选购指南
  • 6667
  • 2025年铁基络合剂源头厂家权威推荐榜单:铁基催化剂/络合铁脱硫催化剂/高效脱硫剂源头厂家精选
  • 记录双系统笔记本系统损坏恢复步骤
  • 学习差的孩子适合用学习机吗?有推荐的品牌吗?​ 2025年学困生专用AI学习机评估与推荐
  • 2025年AI学习机与线下补课效果对比分析
  • 写给0-1岁的初创公司合伙人(48):运气与概率——区分“赌博”与“投资”
  • 2025年PET收缩机源头厂家权威推荐榜单:PET自动收缩机/PP收缩机/PE收缩机源头厂家精选