题面

\(Solution:\)

法一:LCT裸题

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

法二:树链剖分

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

\(Source\)

// luogu-judger-enable-o2
#include <stdio.h>
#include <vector>
#include <assert.h>
#include <ctype.h>
#include <set>
#include <cstring> using namespace std; namespace io {
char buf[1<<21], *pos = buf, *end = buf;
inline char getc()
{ return pos == end && (end = (pos = buf) + fread(buf, 1, 1<<21, stdin), pos == end) ? EOF : *pos ++; }
inline int rint() {
register int x = 0, f = 1; register char c;
while (!isdigit(c = getchar())) if (c == '-') f = -1;
while (x = (x << 1) + (x << 3) + (c ^ 48), isdigit(c = getchar()));
return x * f;
}
template<typename T>
inline bool chkmin(T &x, T y) { return x > y ? (x = y, 0) : 1; }
template<typename T>
inline bool chkmax(T &x, T y) { return x < y ? (x = y, 0) : 1; }
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define ____ debug("go")
#define rep(i, a, b) for (register int i = a; i <= b; ++ i)
#define dep(i, a, b) for (register int i = a; i >= b; -- i)
#define travel(i, u) for (register int i = head[u]; i; i = nxt[i])
#define mem(a, b) memset(a, b, sizeof a)
}
using io::rint;using io::chkmin;using io::chkmax; const int N = 4e5 + 1; int n, m;
int tot, ver[N<<1], head[N], nxt[N<<1];
void add(int u, int v)
{ ver[++tot] = v, nxt[tot] = head[u], head[u] = tot; } int seg[N], size[N], top[N], son[N], cnt, fa[N], dep[N];
void DFS1(int x, int f) {
fa[x] = f;
size[x] = 1;
dep[x] = dep[f] + 1;
travel(i, x) {
if (ver[i] == f) continue;
DFS1(ver[i], x);
size[x] += size[ver[i]];
if (size[son[x]] < size[ver[i]]) son[x] = ver[i];
}
}
void DFS2(int u, int topf) {
seg[u] = ++cnt;
top[u] = topf;
if (son[u]) DFS2(son[u], topf);
else return;
travel(i, u) {
if (ver[i] != fa[u] && ver[i] != son[u]) DFS2(ver[i], ver[i]);
}
} struct BIT {
int s[N];
void insert(int x, int c)
{ for (int i = x; i <= n; i += (i & -i)) s[i] += c; }
int query(int x)
{ int res = 0; for (int i = x; i; i -= (i & -i)) res += s[i]; return res; }
} T; vector<pair<int, int> > War; int Query(int x, int y) {
int ans = 0;
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]]) swap(x, y);//打挂的地方
ans += T.query(seg[x]) - T.query(seg[top[x]] - 1);
x = fa[top[x]];
}
if (dep[x] < dep[y]) swap(x, y);
ans += T.query(seg[x]) - T.query(seg[y]);
return ans;
} int main() {
#ifndef ONLINE_JUDGE
freopen("P3950.in", "r", stdin);
freopen("P3950.out", "w", stdout);
#endif
n = rint(); m = rint();
for (int i = 1; i < n; ++ i) {
int u = rint(), v = rint();
add(u, v); add(v, u);
}
DFS1(1, 0);
DFS2(1, 1);
char op[10]; int x, y;
while (m --) {
scanf("%s", op);
if (op[0] == 'Q') {
x = rint(), y = rint();
if (Query(x, y)) puts("No");
else puts("Yes");
} else if (op[0] == 'U') {
x = rint();
x --;
int u = War[x].first, v = War[x].second;
if (seg[u] < seg[v]) swap(u, v);
T.insert(seg[u], -1);
} else {
x = rint(), y = rint();
if (seg[x] < seg[y]) swap(x, y);
T.insert(seg[x], 1);
War.push_back(make_pair(x, y));
}
}
}

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. HDU 1071 The area(求三个点确定的抛物线的面积,其中一个点是顶点)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1071 The area Time Limit: 2000/1000 MS (Java/Others)  ...

  2. plsql Developer11的工具栏没有了如何找回来

    以前都是用的plsql developer7,最常用的工具类如下: 这次下载了12,发现风格变了,经常用的执行.提交.回滚按钮都在会话菜单下了 如何找回工具栏呢,如下操作:

  3. C#基础实例

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  4. 数据库——MySQL——数据类型

    详细的看后面给的链接,我只是挑了一部分:http://www.runoob.com/mysql/mysql-data-types.html 在之前说了MySQL的存储引擎.它决定了表的类型,而表内存放 ...

  5. oracle 完整性约束的禁用启用以及对表的影响,表的修改和复制

    primary key ----表的唯一性约束,不能为空,且不能有重复值 foreign key ----俩表之间的约束,启用之时,在删除数据时需要先删除父表数据,再删除子表数据 禁用方式为:alte ...

  6. 基于layer封装的异步加载分部视图弹出层

    背景:之前一直用的artdialog,但是样式不是很好看,后来偶然看到layer,觉得不错,但是对于.net mvc来说,不能像artdialog一样弹出分部视图是很难受的.所以下面的方法就解决了. ...

  7. Maximum Subsequence Sum

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...

  8. HTTP缓存初探

    缓存的作用 用户访问一个web页面的频率远高于web页面更新的频率,因此多数时候用户从服务器获取的html.js.css以及图片等内容都是相同的,如果每次访问都从服务器获取这些静态内容即降低了页面加载 ...

  9. html5 手风琴菜单

    因为项目需要,现在需要做个手风琴菜单,于是自己就瞎整了一下,所用只是less.js  javascript  jquery效果如图: 具体代码如下: <!DOCTYPE html> < ...

  10. vue 中父子组件之间的交互

    1,最直接的也是最简单的方法是利用props来数据传值. 子组件定义如下: props: { iconClass: { type: String, required: true }, classNam ...