Codeforces 570D Tree Requests(树上启发式合并)
题目链接 Tree Requests
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define rep(i, a, b) for (int i(a); i <= (b); ++i) 6 7 typedef long long LL; 8 9 const int N = 500010; 10 const int A = 31; 11 12 int cntf[N], sz[N], h[N]; 13 vector <int> v[N]; 14 vector <pair<int, int> > query[N]; 15 16 char s[N]; 17 bool skip[N], cnt[N][A], ans[N]; 18 int n, m, x, y; 19 20 void getsz(int x, int dep){ 21 sz[x] = 1; h[x] = dep; 22 for (auto u : v[x]){ 23 getsz(u, dep + 1); 24 sz[x] += sz[u]; 25 } 26 } 27 28 void add(int x, int val){ 29 cntf[h[x]] -= cnt[h[x]][s[x] - 'a']; 30 cnt[h[x]][s[x] - 'a'] ^= 1; 31 cntf[h[x]] += cnt[h[x]][s[x] - 'a']; 32 33 for (auto u : v[x]) if (!skip[u]) add(u, val); 34 } 35 36 37 void dfs(int x, bool keep){ 38 int mx = 0, p; 39 for (auto u : v[x]){ 40 if (sz[u] > mx){ 41 mx = sz[u]; 42 p = u; 43 } 44 } 45 46 for (auto u : v[x]) if (u != p) dfs(u, 0); 47 if (mx) skip[p] = 1, dfs(p, 1); 48 49 add(x, 1); 50 for (auto q : query[x]){ 51 ans[q.second] = cntf[q.first] <= 1; 52 } 53 54 if (mx) skip[p] = 0; 55 if (!keep) add(x, -1); 56 } 57 58 int main(){ 59 60 scanf("%d%d", &n, &m); 61 rep(i, 2, n){ 62 scanf("%d", &x); 63 v[x].push_back(i); 64 } 65 66 scanf("%s", s + 1); 67 68 getsz(1, 1); 69 70 rep(i, 1, m){ 71 scanf("%d%d", &x, &y); 72 query[x].push_back({y, i}); 73 } 74 75 memset(ans, 0, sizeof ans); 76 dfs(1, 0); 77 rep(i, 1, m) puts(ans[i] ? "Yes" : "No"); 78 79 return 0; 80 }
转载于:https://www.cnblogs.com/cxhscst2/p/6798819.html
Codeforces 570D Tree Requests(树上启发式合并)相关推荐
- CodeForces - 570D Tree Requests(树上启发式合并)
题目链接:点击查看 题目大意:给定一个以1为根的n个节点的树,每个点上有一个字母(a−z),每个点的深度定义为该节点到1号节点路径上的点数,每次询问a,b查询以a为根的子树内深度为b的节点上的字母重新 ...
- 树上启发式合并问题 ---- 2019icpc南昌 K. Tree (树上启发式合并 + 动态开点线段树)
题目链接 题目大意: 就是给你一颗树,每个点有个权值viv_ivi,问你有多少对(x,y)(x,y)(x,y)满足: xxx不是yyy的祖先 yyy也不是xxx的祖先 xxx和yyy的距离不超过kk ...
- 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...
- CodeForces - 600E Lomsat gelral(树上启发式合并)
题目链接:点击查看 题目大意:给出一棵树,每个节点都有一个编号代表一种颜色,现在对于每个子树求出现最多的颜色的编号之和 题目分析:因为n给到了1e5,看完这个题第一反应就是暴力n*n,但显然是会超时的 ...
- Codeforces 600E Lomsat gelral 树上启发式合并,线段树合并.
文章目录 题意 题解 update:洛谷上已经可交此题. 题意 给一棵1为根的树,每个点有个颜色,求每一个点的子树里出现最多的颜色的和. 题解 我们用两组nnn个mapcnt和summap\ cnt和 ...
- 树上启发式合并问题 ---- D. Tree Requests [状态压缩+树上启发式合并]
题目链接 题目大意: 就是给你一颗树,树上每个点都有一个小写字母,现在给你m∈[1,5e5]m\in [1,5e5]m∈[1,5e5]次询问,每次询问给你一个u,和deep,问你在u这课子树中,距离1 ...
- CodeForces - 375D Tree and Queries(树上启发式合并)
题目链接:点击查看 题目大意:给出一棵有根树,每个节点都有一个编号代表颜色,现在给出m个询问,每个询问的形式为u k,需要回答以u为根节点的子树中,数量超过k的颜色有多少种 题目分析:树上启发式合并模 ...
- [dsu on tree]树上启发式合并总结(算法思想及模板附例题练习)
文章目录 前言 树上启发式合并 引入 算法思想 时间复杂度 模板 练习 例题:CF600E Lomsat gelral solution code CF208E Blood Cousins solut ...
- 中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)
题目链接:点击查看 题目大意:给出一棵 n 个节点的树,以点 1 为根,现在对于每个节点作为根的子树求解:子树中有多少个编号不相交的连续子段,如:1 2 4 5 7,共有三个连续的段,分别为 [ 1 ...
最新文章
- web.py做图片上传网页
- id int primary key auto_increment是什么意思
- xtrabackup mysql 5.6_percona-xtrabackup工具实现mysql5.6.34的主从同步复制
- Java开发环境!为什么MySQL不推荐使用uuid作为主键
- 前端学习(1559):ng-classt隔行变色
- collections系列
- java全局机制,java实现全局异常机制
- 利用xsl和xml转html没有内容_HTML文档元素的属性介绍
- HDU1591 Encoded Love-letter【密码】
- MATLAB怎么做出三叶玫瑰线,matlab复习题
- poi导出如何设定宽度_POI导出excel列宽自适应
- 如何制作个人网站(如何搭建个人博客)
- 《数字货币与人民币国际化》读书笔记1
- 下载测试视频网站分享
- 【Unity3D日常开发】Unity中的资源加载与文件路径
- 华为运营商级路由器配置示例 | 配置OptionB方式跨域BGP VPLS示例(ASBR兼做PE)
- U盘在别人电脑上正常显示,插在自己电脑读不出来(只显示CD驱动器)
- 前端开发vue技术栈程序员的vs code插件分享
- 成就系统和任务系统的设计
- 华为怎么分屏操作技巧_第五人格魔术师怎么操作 求生者魔术师操作技巧
热门文章
- scsi协议_存储协议有哪些类型?常见存储协议分析
- python解析html xml最好的模块_python中处理xml的模块哪个好?
- 无线网卡dns服务器没有响应,无线网卡上不去网怎么设置dns
- Java笔记-DH密钥交换获取密钥及AES加解密
- Java笔记-Spring Boot JDBC连接Oracle数据库
- canvas笔记-文本(fillText)旋转(rotate)
- Java笔记-解决Required long parameter 'XXX' is not present
- Linux学习笔记-线程的自然终止
- mac mysql ngram_MySQL ngram
- php公司面试反问,php面试坑集锦