题面

\(Solution:\)

法一:LCT裸题

又好想又好码,只不过常数太大。

法二:树链剖分

每次断边将该边权的值++,连边--,然后边权化点权(给儿子),询问就查询从x到y的路径上的边权和,树状数组套树链剖分维护.

\(Source\)

  1. // luogu-judger-enable-o2
  2. #include <stdio.h>
  3. #include <vector>
  4. #include <assert.h>
  5. #include <ctype.h>
  6. #include <set>
  7. #include <cstring>
  8. using namespace std;
  9. namespace io {
  10. char buf[1<<21], *pos = buf, *end = buf;
  11. inline char getc()
  12. { return pos == end && (end = (pos = buf) + fread(buf, 1, 1<<21, stdin), pos == end) ? EOF : *pos ++; }
  13. inline int rint() {
  14. register int x = 0, f = 1; register char c;
  15. while (!isdigit(c = getchar())) if (c == '-') f = -1;
  16. while (x = (x << 1) + (x << 3) + (c ^ 48), isdigit(c = getchar()));
  17. return x * f;
  18. }
  19. template<typename T>
  20. inline bool chkmin(T &x, T y) { return x > y ? (x = y, 0) : 1; }
  21. template<typename T>
  22. inline bool chkmax(T &x, T y) { return x < y ? (x = y, 0) : 1; }
  23. #define debug(...) fprintf(stderr, __VA_ARGS__)
  24. #define ____ debug("go")
  25. #define rep(i, a, b) for (register int i = a; i <= b; ++ i)
  26. #define dep(i, a, b) for (register int i = a; i >= b; -- i)
  27. #define travel(i, u) for (register int i = head[u]; i; i = nxt[i])
  28. #define mem(a, b) memset(a, b, sizeof a)
  29. }
  30. using io::rint;using io::chkmin;using io::chkmax;
  31. const int N = 4e5 + 1;
  32. int n, m;
  33. int tot, ver[N<<1], head[N], nxt[N<<1];
  34. void add(int u, int v)
  35. { ver[++tot] = v, nxt[tot] = head[u], head[u] = tot; }
  36. int seg[N], size[N], top[N], son[N], cnt, fa[N], dep[N];
  37. void DFS1(int x, int f) {
  38. fa[x] = f;
  39. size[x] = 1;
  40. dep[x] = dep[f] + 1;
  41. travel(i, x) {
  42. if (ver[i] == f) continue;
  43. DFS1(ver[i], x);
  44. size[x] += size[ver[i]];
  45. if (size[son[x]] < size[ver[i]]) son[x] = ver[i];
  46. }
  47. }
  48. void DFS2(int u, int topf) {
  49. seg[u] = ++cnt;
  50. top[u] = topf;
  51. if (son[u]) DFS2(son[u], topf);
  52. else return;
  53. travel(i, u) {
  54. if (ver[i] != fa[u] && ver[i] != son[u]) DFS2(ver[i], ver[i]);
  55. }
  56. }
  57. struct BIT {
  58. int s[N];
  59. void insert(int x, int c)
  60. { for (int i = x; i <= n; i += (i & -i)) s[i] += c; }
  61. int query(int x)
  62. { int res = 0; for (int i = x; i; i -= (i & -i)) res += s[i]; return res; }
  63. } T;
  64. vector<pair<int, int> > War;
  65. int Query(int x, int y) {
  66. int ans = 0;
  67. while (top[x] != top[y]) {
  68. if (dep[top[x]] < dep[top[y]]) swap(x, y);//打挂的地方
  69. ans += T.query(seg[x]) - T.query(seg[top[x]] - 1);
  70. x = fa[top[x]];
  71. }
  72. if (dep[x] < dep[y]) swap(x, y);
  73. ans += T.query(seg[x]) - T.query(seg[y]);
  74. return ans;
  75. }
  76. int main() {
  77. #ifndef ONLINE_JUDGE
  78. freopen("P3950.in", "r", stdin);
  79. freopen("P3950.out", "w", stdout);
  80. #endif
  81. n = rint(); m = rint();
  82. for (int i = 1; i < n; ++ i) {
  83. int u = rint(), v = rint();
  84. add(u, v); add(v, u);
  85. }
  86. DFS1(1, 0);
  87. DFS2(1, 1);
  88. char op[10]; int x, y;
  89. while (m --) {
  90. scanf("%s", op);
  91. if (op[0] == 'Q') {
  92. x = rint(), y = rint();
  93. if (Query(x, y)) puts("No");
  94. else puts("Yes");
  95. } else if (op[0] == 'U') {
  96. x = rint();
  97. x --;
  98. int u = War[x].first, v = War[x].second;
  99. if (seg[u] < seg[v]) swap(u, v);
  100. T.insert(seg[u], -1);
  101. } else {
  102. x = rint(), y = rint();
  103. if (seg[x] < seg[y]) swap(x, y);
  104. T.insert(seg[x], 1);
  105. War.push_back(make_pair(x, y));
  106. }
  107. }
  108. }

P3950部落冲突的更多相关文章

  1. lupgu P3950 部落冲突

    题目链接 luogu P3950 部落冲突 题解 树剖线段树可以 lct还行 代码 #include<cstdio> #include<algorithm> inline in ...

  2. 洛谷 P3950 部落冲突 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例1 输出样例1 输入样例2 输出样例2 输入样例3 输出样例3 说明 思路 AC代码 总结 题面 题目链接 P3 ...

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

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

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

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

  5. P3950 部落冲突

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

  6. 【luogu P3950 部落冲突】 题解

    题目连接:https://www.luogu.org/problemnew/show/P3950 1.像我这种学数据结构学傻了的 2.边权化点权 所有点权初始化0 3.对于战争 将深度较深的-1,对于 ...

  7. 【Luogu】P3950部落冲突(树链剖分)

    题目链接 状态奇差无比,sbt都能错一遍. 不动笔光想没有想到怎么做,画图之后发现一个很明显的性质…… 那就是两个开战的部落,其中一个是另一个的父亲. 所以在儿子那里加个权值.查询的时候树链剖分查询链 ...

  8. 洛谷:P3950 部落冲突

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

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

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

随机推荐

  1. 【luogu P1402 酒店之王】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1402 菜 #include <queue> #include <cstdio> #i ...

  2. 学大伟业 Day 5 培训总结

    今天讲数据结构 先从mzx大佬的ppt摘抄一段: 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 通常情况下,精心选择的数据结构可以带来更高的运行或 ...

  3. o'Reill的SVG精髓(第二版)学习笔记——第一章

    1.1图形系统 计算机中描述图形信息的两大系统是栅格系统(raster graphics)和矢量图形(vector graphics) 1.1.4矢量图形的用途 ①计算机辅助绘图(CAD)程序. ②设 ...

  4. LeetCode15.三数之和 JavaScript

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...

  5. TCP协议与UDP协议

    网络通信协议规定了网络通信时,数据必须采用的格式.常见的协议有TCP协议,UDP协议. TCP协议 :(Transmission Control Protocol)传输控制协议. TCP是一种面向连接 ...

  6. 微信小程序学习笔记(一)

    1.目录及文件构成 1.1 根目录下 ** app.js 是小程序的脚本代码,用来监听并处理小程序的生命周期函数.声明全局变量. ** app.json 是对整个小程序的全局配置,配置小程序是由哪些页 ...

  7. span没有name属性

    <span id="test" name="测试数据">测试咯</span> 在eclipse中这么写发现会有警告提示.百度发现原来sp ...

  8. ABAP术语-Authorization Object

    Authorization Object 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/20/1006585.html Element of ...

  9. DbUtils: JDBC Utility Component Examples翻译

    DbUtils:JDBC实用组件实例 这一页提供了一些展示如何使用DbUtils的示例. 基本用法 DbUtils是一个非常小的类库,因此浏览完所有类的javadoc不会花费很长时间.DbUtils的 ...

  10. mysql主从延时临时解决办法

    主从延时临时解决办法: 主从延迟严重的原因很多,其中有以下原因: 一.由于无主键大表的delete 和update导致. mysql  主从复制时.如果表上没有主键.会导致update和delete操 ...