题:https://codeforces.com/contest/570/problem/D

题意:给定一个以1为根的n个节点的树,每个点上有一个字母(a~z),每个点的深度定义为该节点到1号节点路径上的点数.每次询问a,b查询以a为根的子树内深度为b的节点上的字母重新排列之后是否能构成回文串.

分析:很明显是个树上启发式合并。显然,只要深度为bb结点的所有颜色中,至多有一种的数量为奇数就可以构成回文串了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pb push_back
  4. typedef long long ll;
  5. const int M=5e5+;
  6. int sz[M],son[M],deep[M],w[M],countt[M][],ans[M],vis[M];
  7. char s[M];
  8. vector<int>g[M];
  9. vector<pair<int,int> >Q[M];
  10.  
  11. void dfs1(int u,int fa){
  12. sz[u]=;
  13. deep[u]=deep[fa]+;
  14. for(int i=;i<g[u].size();i++){
  15. int v=g[u][i];
  16. dfs1(v,u);
  17. sz[u]+=sz[v];
  18. if(sz[v]>sz[son[u]])
  19. son[u]=v;
  20. }
  21. }
  22. void update(int u,int k){
  23. countt[deep[u]][w[u]]+=k;
  24. for(int i=;i<g[u].size();i++){
  25. int v=g[u][i];
  26. if(!vis[v])
  27. update(v,k);
  28. }
  29. }
  30. void dfs2(int u,int sign){
  31. for(int i=;i<g[u].size();i++){
  32. int v=g[u][i];
  33. if(v!=son[u])
  34. dfs2(v,);
  35. }
  36. if(son[u])
  37. dfs2(son[u],),vis[son[u]]=;
  38. update(u,);
  39. for(int i=;i<Q[u].size();i++){
  40. int num=;
  41. int id=Q[u][i].first;
  42. int d=Q[u][i].second;
  43. for(int j=;j<;j++){
  44. if(countt[d][j]&)
  45. num++;
  46. }
  47. if(num>)
  48. ans[id]=;
  49. else
  50. ans[id]=;
  51. }
  52. vis[son[u]]=;
  53. if(!sign)
  54. update(u,-);
  55. }
  56. int main(){
  57. int n,m;
  58. scanf("%d%d",&n,&m);
  59. for(int u,i=;i<=n;i++){
  60. scanf("%d",&u);
  61. g[u].pb(i);
  62. }
  63. scanf("%s",s);
  64. for(int i=;i<n;i++)
  65. w[i+]=s[i]-'a';
  66. for(int u,v,i=;i<=m;i++){
  67. scanf("%d%d",&u,&v);
  68. Q[u].pb(make_pair(i,v));
  69. }
  70. dfs1(,);
  71. dfs2(,);
  72. for(int i=;i<=m;i++)
  73. if(ans[i])
  74. printf("Yes\n");
  75. else
  76. printf("No\n");
  77. return ;
  78. }

Codeforces Round #316 (Div. 2) D计算在一棵子树内某高度的节点的更多相关文章

  1. Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和

    Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和 [Problem Description ...

  2. Codeforces Codeforces Round #316 (Div. 2) C. Replacement set

    C. Replacement Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/proble ...

  3. Codeforces Codeforces Round #316 (Div. 2) C. Replacement 线段树

    C. ReplacementTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/problem ...

  4. Codeforces Round #316 (Div. 2)

    A. Elections time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  5. Codeforces Round #316 (Div. 2) (ABC题)

    A - Elections 题意: 每一场城市选举的结果,第一关键字是票数(降序),第二关键字是序号(升序),第一位获得胜利. 最后的选举结果,第一关键字是获胜城市数(降序),第二关键字是序号(升序) ...

  6. Codeforces Round #316 (Div. 2) C. Replacement

    题意:给定一个字符串,里面有各种小写字母和' . ' ,无论是什么字母,都是一样的,假设遇到' . . ' ,就要合并成一个' .',有m个询问,每次都在字符串某个位置上将原来的字符改成题目给的字符, ...

  7. Codeforces Round #316 (Div. 2)E. Pig and Palindromes DP

    E. Pig and Palindromes   Peppa the Pig was walking and walked into the forest. What a strange coinci ...

  8. Codeforces Round #316 (Div. 2) B. Simple Game

    思路:把n分成[1,n/2],[n/2+1,n],假设m在左区间.a=m+1,假设m在右区间,a=m-1.可是我居然忘了处理1,1这个特殊数据.被人hack了. 总结:下次一定要注意了,提交前一定要看 ...

  9. Codeforces Round #316 (Div. 2) D. Tree Requests dfs序

    D. Tree Requests time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

随机推荐

  1. C++基础--函数模板

    函数模板是通用的函数描述,其使用泛型来定义函数.其实就是有些操作,如果撇开具体的变量的数据类型,其操作是一样的如果我们将这些操作写成一个模板,在调用不同变量的时候就设定好变量类型就可了,后续的操作基本 ...

  2. 如何做好Essay Proofreading?

    终于写完了一篇Essay,瞬间感觉人生轻松了好多!别急,想要Essay最终得到高分,你还需要最后一步:论文润色! 换句话说,就是我们需要写完的Essay进行检查校对.那么我们一般需要校对的部分有哪些呢 ...

  3. Android群英传神兵利器读书笔记——第二章:版本控制神器——Git

    本人一直是徐医生的真爱粉,由于参加比赛耽误了8天,导致更新得有点慢,大家见谅 2.1 Git的前世今生 Git是什么 Git安装与配置 2.2 创建Git仓库 Git init Git clone 2 ...

  4. 用Python在00:00给微信好友发元旦祝福语

    2019年的元旦即将来临,这里用Python撸一串简单的代码来实现定点给微信里的所有小伙伴发祝福语 环境说明 Python版本: 不限 第三方库: itchat, schedule 注:所有祝福语来源 ...

  5. Linux学习-课后练习(第二章命令)20200216

  6. 四、python杂项

    一.pycharm单行和多行注释快捷键                        多行注释就一个组合键:选中+Ctrl+/

  7. Java线程——线程之间的通信

    Java中多线程间的通信是怎么实现的? 线程通信的方式: (1)共享变量 线程之间的通信可以通过发送信号,发送信号的一个简单方法就是再共享的对象里面设置信号值.线程A在一个同步块中设置boolean型 ...

  8. 吴裕雄--天生自然MySQL学习笔记:MySQL 临时表

    MySQL 临时表在我们需要保存一些临时数据时是非常有用的.临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间. MySQL临时表只在当前连接可见,如果使用PHP脚本来创建My ...

  9. UML-GRASP后4种模式

    1.多态 1).什么是多态 问题:if-else耦合度过高 解决: 方法1:接口 方法2:超类里需多态的方法前加上{abstract} 2).相关模式 防止异变 大量GoF,如适配器(Adapter) ...

  10. ACwing算法基础课听课笔记(第一章,基础算法一)(二分)

    二分法: 在看这个视频前,我对于二分法是一头雾水的,又加上这个算法平常从来没写过所以打了一年了还没正式搞过.视频提到ACwing上的一道题,我用自以为聪明的方法去做,结果TLE了,实在丢人,不说了,开 ...