题面

题目链接

P3950 部落冲突

题目描述

在一个叫做Travian的世界里,生活着各个大大小小的部落。其中最为强大的是罗马、高卢和日耳曼。他们之间为了争夺资源和土地,进行了无数次的战斗。期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事。

其中,在大大小小的部落之间,会有一些道路相连,这些道路是Travian世界里的重要枢纽,简单起见,你可以把这些部落与部落之间相连的道路看作一颗树,可见每条道路对于Travian世界的重要程度。有了这些道路,建筑工人就可以通过这些道路进行友好外交啦。

然而,事情并不会像想象的那样美好,由于资源的匮乏,相邻的部落(由一条道路相连的部落)之间经常会发生大大小小的冲突事件,更有甚者,会升级为部落之间的大型战争。

为了避免误伤,每当两个相邻的部落之间发生大型战争之时,这两个部落间的道路是不允许通行的,对于一些强大的部落,甚至能与多个相邻的部落同时开战,同样的,这些战争地带的道路十分危险,是不可通行的。

天下之势,分久必合,当两个部落经历了不打不相识的苦战之后,他们可以签订停战协议(暂时停战,以后依旧可能再次开战),这样,两个部落之间的道路又会重新恢复为可通行状态,建筑工人们又可以经过此地购买最新的大本营设计图纸来强大自己的部落了。

为了简单起见,我们把各大战争事件按发起的时间顺序依次编号(最先发起的战争编号就为 1,第二次战争编号就为 2,以此类推),当两个部落停战之时,则会直接告诉你这场战争的编号,然后这场战争就载入了史册,不复存在了,当然,这并不会影响到其他战争的编号。

建筑工人十分讨厌战争,因为战争,想从一个部落到另一个部落进行友好交流的建筑工人可能就此白跑一趟。所以,在他们出发之前,都会向你问问能不能到达他们想去的部落。

简单起见,你就是要处理下面三件事,所有的事件都是按照时间顺序给出的。

  1. $ (Q p q) $ 从第 $ p $ 个部落出发的建筑工人想知道能否到达第 $ q $ 部落了,你要回答的便是(Yes/No),注意大小写

  2. $ (C p q) $ 第 $ p $ 个部落与第 $ q $ 个部落开战了,保证他们一定是相邻的部落,且目前处于停战(未开战)状态

  3. $ (U x) $ 第 $ x $ 次发生的战争结束了,它将永远的被载入史册,不复存在(保证这个消息不会告诉你多次)

输入输出格式

输入格式

第一行两个数 $ n $ 和 $ m , n $ 代表了一共有 $ n $ 个部落, $ m $ 代表了以上三种事件发生的总数

接下来的 $ n-1 $ 行,每行两个数 $ p,q $ ,代表了第 $ p $ 个部落与第 $ q $ 个部落之间有一条道路相连

接下来的 $ m $ 行,每行表示一件事,详见题目描述

输出格式

每行一个“Yes”或者“No”,表示从第 $ p $ 个部落出发的建筑工人能否到达第 $ q $ 个部落

输入输出样例

输入样例1

  1. 5 9
  2. 1 2
  3. 2 3
  4. 3 4
  5. 4 5
  6. Q 1 4
  7. C 2 1
  8. C 4 3
  9. Q 3 1
  10. Q 1 5
  11. U 1
  12. U 2
  13. C 4 3
  14. Q 3 4

输出样例1

  1. Yes
  2. No
  3. No
  4. No

输入样例2

  1. 10 10
  2. 1 2
  3. 1 3
  4. 3 4
  5. 3 5
  6. 1 6
  7. 3 7
  8. 1 8
  9. 2 9
  10. 5 10
  11. C 8 1
  12. Q 6 1
  13. C 2 1
  14. Q 2 10
  15. U 1
  16. C 9 2
  17. C 7 3
  18. U 3
  19. Q 6 7
  20. Q 1 10

输出样例2

  1. Yes
  2. No
  3. No
  4. Yes

输入样例3

  1. 20 20
  2. 1 2
  3. 1 3
  4. 2 4
  5. 1 5
  6. 1 6
  7. 4 7
  8. 1 8
  9. 2 9
  10. 5 10
  11. 1 11
  12. 2 12
  13. 7 13
  14. 1 14
  15. 1 15
  16. 11 16
  17. 4 17
  18. 3 18
  19. 18 19
  20. 8 20
  21. Q 13 5
  22. C 14 1
  23. C 16 11
  24. U 1
  25. U 2
  26. C 20 8
  27. Q 7 1
  28. C 7 4
  29. Q 17 17
  30. Q 1 6
  31. C 16 11
  32. C 2 1
  33. Q 16 2
  34. U 3
  35. U 5
  36. U 6
  37. C 2 1
  38. C 6 1
  39. C 13 7
  40. C 11 1

输出样例3

  1. Yes
  2. Yes
  3. Yes
  4. Yes
  5. No

说明

对于30%的数据 $ 1 \leq n , m \leq 6000 $

对于另30%的数据,保证部落之间的地理关系是一条链,且 $ i $ 与 $ i+1 $ 之间有一条道路

对于另30%的数据, $ 1 \leq n , m \leq 100000 $

对于100%的数据, $ 1 \leq n , m \leq 300000 $

【时空限制】

1000ms,128MB

思路

原题怎么这么长,还配了一张图。。。

这题意思简化一下就是,每次可以让一条边权值减1或加1,问两点间路径上有没有边权值小于0(大概就这样吧)

其实是好久没写树剖所以来水一道题啦

AC代码

  1. #include<bits/stdc++.h>
  2. const int maxn=300010;
  3. using namespace std;
  4. int n,m;
  5. int tot,to[maxn<<1],nxt[maxn<<1],head[maxn];
  6. int a[maxn];
  7. int fa[maxn],son[maxn],len[maxn],dep[maxn];
  8. int cnt,nid[maxn],top[maxn];
  9. struct SegmentTree
  10. {
  11. int l,r,sum;
  12. #define l(a) tree[a].l
  13. #define r(a) tree[a].r
  14. #define m(a) ((l(a)+r(a))>>1)
  15. #define len(a) (r(a)-l(a)+1)
  16. #define s(a) tree[a].sum
  17. }tree[maxn<<2];
  18. void dfs1(int u,int f,int d)
  19. {
  20. fa[u]=f;dep[u]=d;len[u]=1;
  21. for(int i=head[u];i;i=nxt[i])
  22. {
  23. int v=to[i];
  24. if(v==f) continue;
  25. dfs1(v,u,d+1);
  26. len[u]+=len[v];
  27. if(len[v]>len[son[u]]) son[u]=v;
  28. }
  29. }
  30. void dfs2(int p,int t)
  31. {
  32. top[p]=t;
  33. nid[p]=++cnt;
  34. if(!son[p]) return;
  35. dfs2(son[p],t);
  36. for(int i=head[p];i;i=nxt[i])
  37. {
  38. int v=to[i];
  39. if(v==fa[p] ||v==son[p]) continue;
  40. dfs2(v,v);
  41. }
  42. }
  43. void BuildTree(int p,int l,int r)
  44. {
  45. l(p)=l;r(p)=r;
  46. if(l==r) return;
  47. BuildTree(p<<1,l,m(p));
  48. BuildTree(p<<1|1,m(p)+1,r);
  49. }
  50. void Change(int np,int p)
  51. {
  52. if(l(np)==r(np))
  53. {
  54. s(np)^=1;
  55. return;
  56. }
  57. if(p<=m(np)) Change(np<<1,p);
  58. else Change(np<<1|1,p);
  59. s(np)=s(np<<1)+s(np<<1|1);
  60. }
  61. int Ask1(int p,int l,int r)
  62. {
  63. if(l<=l(p) && r>=r(p)) return s(p);
  64. int ans=0;
  65. if(l<=m(p)) ans+=Ask1(p<<1,l,r);//if(ans>0) return ans;
  66. if(r>m(p)) ans+=Ask1(p<<1|1,l,r);//if(ans>0) return ans;
  67. return ans;
  68. }
  69. int Ask2(int u,int v)
  70. {
  71. int ans=0;
  72. while(top[u]!=top[v])
  73. {
  74. if(dep[top[u]]<dep[top[v]]) swap(u,v);
  75. ans+=Ask1(1,nid[top[u]],nid[u]);
  76. u=fa[top[u]];
  77. }
  78. if(u==v) return ans;
  79. if(dep[u]>dep[v]) swap(u,v);
  80. ans+=Ask1(1,nid[u]+1,nid[v]);
  81. return ans;
  82. }
  83. int main()
  84. {
  85. scanf("%d%d",&n,&m);
  86. for(int i=1,u,v;i<n;i++)
  87. {
  88. scanf("%d%d",&u,&v);
  89. to[++tot]=v;nxt[tot]=head[u];head[u]=tot;
  90. to[++tot]=u;nxt[tot]=head[v];head[v]=tot;
  91. }
  92. dfs1(1,1,1);
  93. dfs2(1,1);
  94. BuildTree(1,1,n);
  95. cnt=0;
  96. for(int i=1;i<=m;i++)
  97. {
  98. char opt;int x,y;
  99. cin>>opt;
  100. if(opt=='Q')
  101. {
  102. scanf("%d%d",&x,&y);
  103. if(Ask2(x,y)) printf("No\n");
  104. else printf("Yes\n");
  105. }
  106. else if(opt=='C')
  107. {
  108. scanf("%d%d",&x,&y);
  109. ++cnt;a[cnt]=(dep[x]>dep[y]? x:y);
  110. Change(1,nid[a[cnt]]);
  111. }
  112. else
  113. {
  114. scanf("%d",&x);
  115. Change(1,nid[a[x]]);
  116. }
  117. }
  118. return 0;
  119. }

总结

这道题不难。但是题中所给的条件一定要用好,比如战争的两点一定相邻。

回顾一下以前的知识点总是好的

洛谷 P3950 部落冲突 树链剖分的更多相关文章

  1. luogu题解 P3950部落冲突--树链剖分

    题目链接 https://www.luogu.org/problemnew/show/P3950 分析 大佬都用LCT,我太弱只会树链剖分 一个很裸的维护边权树链剖分题.按照套路,对于一条边\(< ...

  2. BZOJ2243 洛谷2486 [SDOI2011]染色 树链剖分

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2243 题目传送门 - 洛谷2486 题意概括 一棵树,共n个节点. 让你支持以下两种操作,共m次操 ...

  3. 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)

    题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...

  4. 洛谷:P3950 部落冲突

    原题地址:https://www.luogu.org/problemnew/show/P3950 题目简述 给定一棵树,每次给定一个操作,有如下两种: 将某条边染黑 2.询问给定的u,v两点间是否有边 ...

  5. 洛谷P3950 部落冲突 [LCT]

    题目传送门 部落冲突 格式难调,体面就不放了. 分析: julao们应该都看得出来就是个$LCT$板子,战争就$cut$,结束就$link$,询问就$find$.没了... 太久没打$LCT$,然后发 ...

  6. 洛谷P3459 [POI2007]MEG-Megalopolis [树链剖分]

    题目传送门 MEG 题目描述 Byteotia has been eventually touched by globalisation, and so has Byteasar the Postma ...

  7. 洛谷P3950 部落冲突(LCT)

    洛谷题目传送门 最无脑LCT题解,Dalao们的各种算法都比这个好多啦... 唯一的好处就是只管码代码就好了 开战cut,停战link,询问findroot判连通性 太无脑,应该不用打注释了.常数大就 ...

  8. 【刷题】洛谷 P3950 部落冲突

    题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多 ...

  9. 洛谷 P2486 [SDOI2011]染色 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 PushDown与Update Q AC代码 总结与拓展 题面 题目链接 P2486 ...

随机推荐

  1. 8种nosql数据库对比

    1. CouchDB 所用语言: Erlang 特点:DB一致性,易于使用 使用许可: Apache 协议: HTTP/REST 双向数据复制, 持续进行或临时处理, 处理时带冲突检查, 因此,采用的 ...

  2. JSOI 2016 扭动的字符串

    JSOI 2016 扭动的字符串 题面描述 给出两个长度为\(n\)的字符串\(A,B\) \(S(i,j,k)\)表示把\(A\)中的\([i,j]\)和\(B\)中的\([j,k]\)拼接起来的字 ...

  3. Windows API 第17篇 GetLogicalDriveStrings 获取本机所有逻辑驱动器,以根目录的形式表示

    函数原型:DWORD GetLogicalDriveStrings(  DWORD nBufferLength,  // size of buffer                          ...

  4. python 打印的异常回溯和代码不对应

    正在运行的程序没有停止 又重新install了导致site-packages里的代码改变 正在运行的是老代码, 当出现异常时打印的行数是老代码,但显示的行的内容时新代码

  5. Spring注解驱动开发(三)-----自动装配

    自动装配 概念 Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值. @Autowired-----自动注入 1.默认优先按照类型去容器中找对应的组件 application ...

  6. JS防抖动

    这道题目经常与事件触发器同时存在,为了考察面试者在一些具体业务流程上(信息流,搜索框输入查询)等,能否综合的考虑实现思路. 题目:在某些信息列表中一般采用瀑布流,滚动一屏时加载相应的数据,请思考如何避 ...

  7. zabbix告警模板

    邮件 webhook模板 ZABBIX告警通知 告警状态:[{TRIGGER.STATUS}] 告警主机:[{HOST.NAME}] 主机地址:[{HOST.IP}] 告警时间:[{EVENT.DAT ...

  8. mysql导出数据库某些表的数据

    # 导出数据,一般从从库导出,减少主库的压力.mysqldump -hhostname -P3306 --single-transaction --master-data= database_name ...

  9. spring源码学习之AOP(二)

    接着上一篇中的内容! 3.创建代理 在获取了所有的bean对应的增强器之后,便可以进行代理的创建了org.springframework.aop.framework.autoproxy包下的Abstr ...

  10. sql作业启停服务器

    IF EXISTS(SELECT * FROM msdb.dbo.sysjobs WHERE name='启用pubs数据库') EXEC msdb.dbo.sp_delete_job @job_na ...