传送门


首先肯定考虑树剖,这里没有要求区间加,所以可以用树状数组维护,不会卡常的

这里是边权,可以转化为点权:让每条边连接的较深的节点的点权等于边权即可,然后计算的时候减去lca

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define MAXN 300005
  6. #define LOG 20
  7. using namespace std;
  8. int read(){
  9. int x=;char ch=getchar();
  10. while(ch<''||ch>''){ch=getchar();}
  11. while(ch>=''&&ch<=''){x=x*+(ch^);ch=getchar();}
  12. return x;
  13. }
  14. int n,T;
  15. int a[MAXN],dat[MAXN];
  16. int dep[MAXN],size[MAXN],gs[MAXN],fa[][MAXN];
  17. int top[MAXN],tree[MAXN],pre[MAXN],tot;
  18. int first[MAXN],nxt[MAXN<<],to[MAXN<<],cnt;
  19. int id[MAXN],tmp;
  20.  
  21. void add(int x,int y){
  22. nxt[++cnt]=first[x];first[x]=cnt;to[cnt]=y;
  23. nxt[++cnt]=first[y];first[y]=cnt;to[cnt]=x;
  24. }
  25. int lca(int x,int y){
  26. if(dep[x]<dep[y]){
  27. swap(x,y);
  28. }
  29. for(int k=dep[x]-dep[y],p=;k;k>>=,p++){
  30. if(k&){
  31. x=fa[p][x];
  32. }
  33. }
  34. if(x==y){
  35. return x;
  36. }
  37. for(int k=LOG-;k>=;k--){
  38. if(fa[k][x]!=fa[k][y]){
  39. x=fa[k][x],y=fa[k][y];
  40. }
  41. }
  42. return fa[][x];
  43. }
  44. void change(int k,int x){
  45. while(k<=n){
  46. dat[k]+=x;
  47. k+=(k&-k);
  48. }
  49. }
  50. int query(int k){
  51. int ret=;
  52. while(k>=){
  53. ret+=dat[k];
  54. k-=(k&-k);
  55. }
  56. return ret;
  57. }
  58. void dfs1(int x){
  59. size[x]=;
  60. for(int e=first[x];e;e=nxt[e]){
  61. int y=to[e];
  62. if(y==fa[][x]){
  63. continue;
  64. }
  65. fa[][y]=x;
  66. dep[y]=dep[x]+;
  67. dfs1(y);
  68. size[x]+=size[y];
  69. if(size[y]>size[gs[x]]){
  70. gs[x]=y;
  71. }
  72. }
  73. }
  74. void dfs2(int x,int t){
  75. top[x]=t;
  76. tree[x]=(++tot);
  77. pre[tot]=x;
  78. if(!gs[x]){
  79. return;
  80. }
  81. dfs2(gs[x],t);
  82. for(int e=first[x];e;e=nxt[e]){
  83. int y=to[e];
  84. if(y==fa[][x]||y==gs[x]){
  85. continue;
  86. }
  87. dfs2(y,y);
  88. }
  89. }
  90. int ask(int x,int y){
  91. int f1=top[x],f2=top[y];
  92. if(dep[f1]<dep[f2]){
  93. swap(x,y),swap(f1,f2);
  94. }
  95. int ret=-a[lca(x,y)];
  96. while(f1!=f2){
  97. ret+=query(tree[x])-query(tree[f1]-);
  98. x=fa[][f1]; f1=top[x];
  99. if(dep[f1]<dep[f2]){
  100. swap(x,y),swap(f1,f2);
  101. }
  102. }
  103. if(dep[x]<dep[y]){
  104. swap(x,y);
  105. }
  106. ret+=query(tree[x])-query(tree[y]-);
  107. return (ret<=);
  108. }
  109. void init(){
  110. n=read();T=read();
  111. for(int i=;i<n;i++){
  112. int x=read(),y=read();
  113. add(x,y);
  114. }
  115. dfs1();
  116. dfs2(,);
  117. for(int k=;k<LOG;k++){
  118. for(int i=;i<=n;i++){
  119. fa[k][i]=fa[k-][fa[k-][i]];
  120. }
  121. }
  122. }
  123. void solve(){
  124. char ch[];
  125. while(T--){
  126. scanf("%s",ch);
  127. int x=read();
  128. if('Q'==ch[]){
  129. int y=read();
  130. if(ask(x,y)){
  131. printf("Yes\n");
  132. }
  133. else{
  134. printf("No\n");
  135. }
  136. }
  137. else if('C'==ch[]){
  138. int y=read();
  139. if(dep[x]<dep[y]){
  140. swap(x,y);
  141. }
  142. change(tree[x],);
  143. a[x]++;
  144. id[++tmp]=x;
  145. }
  146. else{
  147. x=id[x];
  148. change(tree[x],-);
  149. a[x]--;
  150. }
  151. }
  152. }
  153. int main()
  154. {
  155. init();
  156. solve();
  157. return ;
  158. }

树剖AC

也可以是树上差分,用树状数组+dfs序,本质上是差不多的

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define MAXN 300005
  6. #define LOG 20
  7. using namespace std;
  8. int read(){
  9. int x=;char ch=getchar();
  10. while(ch<''||ch>''){ch=getchar();}
  11. while(ch>=''&&ch<=''){x=x*+(ch^);ch=getchar();}
  12. return x;
  13. }
  14. int n,T;
  15. int first[MAXN],nxt[MAXN<<],to[MAXN<<],cnt;
  16. int pin[MAXN],pout[MAXN],tot;
  17. int dat[MAXN<<];
  18. int fa[LOG][MAXN],dep[MAXN];
  19. int id[MAXN],tmp;
  20. void change(int k,int x){
  21. while(k<=(n<<)){
  22. dat[k]+=x;
  23. k+=(k&-k);
  24. }
  25. }
  26. int query(int k){
  27. int ret=;
  28. while(k>=){
  29. ret+=dat[k];
  30. k-=(k&-k);
  31. }
  32. return ret;
  33. }
  34. void add(int x,int y){
  35. nxt[++cnt]=first[x];first[x]=cnt;to[cnt]=y;
  36. nxt[++cnt]=first[y];first[y]=cnt;to[cnt]=x;
  37. }
  38. int lca(int x,int y){
  39. if(dep[x]<dep[y]){
  40. swap(x,y);
  41. }
  42. for(int k=dep[x]-dep[y],p=;k;k>>=,p++){
  43. if(k&){
  44. x=fa[p][x];
  45. }
  46. }
  47. if(x==y){
  48. return x;
  49. }
  50. for(int k=LOG-;k>=;k--){
  51. if(fa[k][x]!=fa[k][y]){
  52. x=fa[k][x],y=fa[k][y];
  53. }
  54. }
  55. return fa[][x];
  56. }
  57. void dfs(int x){
  58. pin[x]=(++tot);
  59. for(int e=first[x];e;e=nxt[e]){
  60. int y=to[e];
  61. if(y==fa[][x]){
  62. continue;
  63. }
  64. dep[y]=dep[x]+;
  65. fa[][y]=x;
  66. dfs(y);
  67. }
  68. pout[x]=(++tot);
  69. }
  70. int ask(int x,int y){
  71. int t=query(pin[x])+query(pin[y])-*query(pin[lca(x,y)]);
  72. return (t<=);
  73. }
  74. void init(){
  75. n=read(); T=read();
  76. for(int i=;i<n;i++){
  77. int x=read(),y=read();
  78. add(x,y);
  79. }
  80. dfs();
  81. for(int k=;k<LOG;k++){
  82. for(int i=;i<=n;i++){
  83. fa[k][i]=fa[k-][fa[k-][i]];
  84. }
  85. }
  86. }
  87. void solve(){
  88. char ch[]={};
  89. while(T--){
  90. scanf("%s",ch);
  91. int x=read();
  92. if('Q'==ch[]){
  93. int y=read();
  94. if(ask(x,y)){
  95. printf("Yes\n");
  96. }
  97. else{
  98. printf("No\n");
  99. }
  100. }
  101. else if('C'==ch[]){
  102. int y=read();
  103. if(dep[x]<dep[y]){
  104. swap(x,y);
  105. }
  106. change(pin[x],);
  107. change(pout[x]+,-);
  108. id[++tmp]=x;
  109. }
  110. else{
  111. x=id[x];
  112. change(pin[x],-);
  113. change(pout[x]+,);
  114. }
  115. }
  116. }
  117. int main()
  118. {
  119. // freopen("data.in","r",stdin);
  120. init();
  121. solve();
  122. return ;
  123. }

树上差分AC

WISCO信息组NOIP模拟赛-部落冲突的更多相关文章

  1. WISCO信息组NOIP模拟赛-数据结构

    传送门 差分+暴力 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstri ...

  2. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  3. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  6. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  7. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  8. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  9. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

随机推荐

  1. win7下,使用django运行django-admin.py无法创建网站

    安装django的步骤: 1.安装python,选择默认安装在c盘即可.设置环境变量path,值添加python的安装路径. 2.下载ez_setup.py,下载地址:http://peak.tele ...

  2. android头像选择(拍照,相册,裁剪)

    组织头像上传时候,不兼容android6.0,并且 imageview.setImageBitmap(BitmapFactory.decodeFile(IMAGE_FILE_LOCATION));// ...

  3. PV & PVC - 每天5分钟玩转 Docker 容器技术(150)

    Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足. 拿前面 AWS EBS 的例子来说,要使用 Volume,Pod 必须事先知道如下信息: 当前 Volume 来自 AWS EB ...

  4. sql 多条记录插入

    --多条记录插入,用逗号分开值. INSERT dbo.studentinfor ( id, name, class, age, hpsw ) ', -- id - nvarchar(50) N'te ...

  5. 前端基础之CSS-Day13

    1.CSS 语法 1.1.CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. selector { property: value; property: value; ... proper ...

  6. vueJs 源码解析 (三) 具体代码

    vueJs 源码解析 (三) 具体代码 在之前的文章中提到了 vuejs 源码中的 架构部分,以及 谈论到了 vue 源码三要素 vm.compiler.watcher 这三要素,那么今天我们就从这三 ...

  7. kubernetes入门(09)kubernetes的命令

    Help执行<kubectl>或<kubectl help> | <kubectl --help>获得命令的帮助信息.kubectl的帮助信息.示例相当详细,而且简 ...

  8. OAuth2.0学习(1-10)新浪开放平台微博认证-手机应用授权和refresh_token刷新access_token

    1.当你是使用微博官方移动SDK的移动应用时,授权返回access_token的同时,还会多返回一个refresh_token: JSON 1 2 3 4 5 6 {     "access ...

  9. C#微信公众号开发——access_token的获取

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_toke ...

  10. jenkins创建multibranch pipeline

    参考以下文章进行实践: https://jenkins.io/doc/pipeline/tour/hello-world/#what-is-a-jenkins-pipeline (看见一个介绍的还不错 ...