当前位置: 首页 > 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.gsyq.cn/news/56410.html

相关文章:

  • 小型食品厂省心了!CLC-S22R 控温又省成本​
  • 2025 最新推荐装盒机厂家权威排行榜:全自动 / 食品 / 纸巾 / 卫生巾装盒机技术创新与整线配套能力测评
  • Galera Cluster部署 - 详解
  • 模拟机问题
  • 2025年主流学习机品牌差异化分析与选购指南
  • 6667
  • 2025年铁基络合剂源头厂家权威推荐榜单:铁基催化剂/络合铁脱硫催化剂/高效脱硫剂源头厂家精选
  • 学习差的孩子适合用学习机吗?有推荐的品牌吗?​ 2025年学困生专用AI学习机评估与推荐
  • 2025年AI学习机与线下补课效果对比分析
  • FCN全卷积网络 (Fully Convolutional Network)——第一个成功地将深度学习应用于语义分割
  • 写给0-1岁的初创公司合伙人(48):运气与概率——区分“赌博”与“投资”
  • 2025年PET收缩机源头厂家权威推荐榜单:PET自动收缩机/PP收缩机/PE收缩机源头厂家精选
  • 【Ai自习室创业靠谱吗,有推荐的加盟/代理品牌吗?】2025年智适应自习室创业投资深度解析
  • 成都恒利泰国产H3-TCP-2-10+ 功分器替代Mini-CircuitsTCP-2-10+
  • 网页前端 加水印
  • CAN网关的作用到底是什么?(转载)
  • macos虚拟机-演示篇三配置clover/opencore引导
  • 2025年智适应Ai自习室市场前景与加盟投资指南
  • Day25:2025年10月15日,星期三,上班。
  • 【完结20章】AI Agent+MCP从0到1打造个人专属编程智能体
  • gearman如何实现负载均衡
  • 对数几率回归算法伪代码
  • 2025 年质量好的四川球墨铸铁管 top 品牌厂家排行榜
  • Day16:2025年10月6日,星期一,值班,万事顺遂。
  • 《避开这7个坑,你的QMS项目就成功了一半》‌
  • 从花果山到文明镜鉴:一位元诗人的AI元人文构想之路
  • 亚马逊云代理:AWS的EC2, S3, RDS,Lambda具体简介 - 指南
  • 2025 年 11 月模具厂家推荐排行榜,精密模具,塑胶模具,精密注塑模具,高精密模具,高精度塑胶模具公司精选
  • 2025 年 11 月注塑厂家推荐排行榜,塑胶注塑,模具注塑,注塑加工,精密注塑公司推荐,专业实力与高效生产口碑之选
  • 2025 年防爆合格证办理机构推荐深圳诚云检测:全链条认证服务 + 定制化方案,助力企业合规入市