题目连接:https://www.luogu.org/problemnew/show/P3950
1.像我这种学数据结构学傻了的
2.边权化点权 所有点权初始化0
3.对于战争 将深度较深的-1,对于和平 将深度较深的+1
4.对于历史 用war记录
5.特别注意 在两个查询的LCA处判断是否为-1并且当前的整条路径上的点权也为-1时 同样是yes
代码:

include

include

include

include

define lson left, mid, rt<<1

define rson mid + 1, right, rt<<1|1

using namespace std;
const int maxn = 300000 + 10;
struct war{
int u, v;
}wa[maxn];
int war_cnt = 0;
struct edge{
int from, next, to;
}e[maxn<<2];
int head[maxn], cnt;
int tree[maxn<<2], lazy[maxn<<2];
int seg[maxn], top[maxn], fa[maxn], son[maxn], size[maxn], deep[maxn], rev[maxn], num;
int node[maxn], n, m, root, res;
void add(int u, int v)
{
e[++cnt].from = u;
e[cnt].next = head[u];
e[cnt].to = v;
head[u] = cnt;
}
//-----segment_tree-----
void PushUP(int rt)
{
tree[rt] = tree[rt<<1] + tree[rt<<1|1];
}
void build(int left, int right, int rt)
{
if(left == right)
{
tree[rt] = rev[left];
return;
}
int mid = (left + right)>>1;
build(lson);
build(rson);
PushUP(rt);
}
void PushDOWN(int left, int right, int rt, int mid)
{
lazy[rt<<1] += lazy[rt];
lazy[rt<<1|1] += lazy[rt];
tree[rt<<1] += lazy[rt](mid - left + 1);
tree[rt<<1|1] += lazy[rt]
(right - mid);
lazy[rt] = 0;
}
void update(int l, int r, int add, int left, int right, int rt)
{
if(l <= left && right <= r)
{
tree[rt] += (right - left + 1)add;
lazy[rt] += add;
return;
}
int mid = (left + right)>>1;
if(lazy[rt]) PushDOWN(left, right, rt, mid);
if(l <= mid) update(l, r, add, lson);
if(r > mid) update(l, r, add, rson);
PushUP(rt);
}
int query(int l, int r, int left, int right, int rt)
{
int res = 0;
if(l <= left && right <= r)
{
return tree[rt];
}
int mid = (left + right)>>1;
if(lazy[rt]) PushDOWN(left, right, rt, mid);
if(l <= mid) res += query(l, r, lson);
if(r > mid) res += query(l, r, rson);
return res;
}
//-----------
void dfs1(int u, int f, int d)
{
int maxson = -1;
size[u] = 1;
deep[u] = d;
fa[u] = f;
for(int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].to;
if(f != v)
{
dfs1(v, u, d+1);
size[u] += size[v];
if(size[v] > maxson) son[u] = v, maxson = size[v];
}
}
}
void dfs2(int u, int t)
{
seg[u] = ++num;
rev[num] = node[u];
top[u] = t;
if(!son[u]) return;
dfs2(son[u], t);
for(int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].to;
if(v == son[u] || v == fa[u]) continue;
dfs2(v, v);
}
}
int LCA(int x, int y)
{
while(top[x] != top[y])
{
if(deep[top[x]] < deep[top[y]]) swap(x, y);
x = fa[top[x]];
}
return deep[x] < deep[y] ? x : y;
}
int qRange(int x, int y)
{
int ans = 0;
while(top[x] != top[y])
{
if(deep[top[x]] < deep[top[y]]) swap(x, y);
res = 0;
res = query(seg[top[x]], seg[x], 1, n, 1);
ans = (ans + res);
x = fa[top[x]];
}
if(deep[x] > deep[y]) swap(x, y);
res = 0;
res = query(seg[x], seg[y], 1, n, 1);
ans = (ans + res);
return ans;
}
void updRange(int x, int y, int k)
{
while(top[x] != top[y])
{
if(deep[top[x]] < deep[top[y]]) swap(x, y);
update(seg[top[x]], seg[x], k, 1, n, 1);
x = fa[top[x]];
}
if(deep[x] > deep[y]) swap(x, y);
update(seg[x], seg[y], k, 1, n, 1);
}
int main()
{
//freopen("out.txt","w",stdout);
memset(head, -1, sizeof(head));
memset(node, 0, sizeof(node));
scanf("%d%d",&n,&m);
root = 1;
for(int i = 1; i < n; i++)
{
int u, v;
scanf("%d%d",&u,&v);
add(u, v); add(v, u);
}
dfs1(root,0,1);
dfs2(root,root);
build(1,n,1);
for(int i = 1; i <= m; i++)
{
char opt;
int u, v, x;
cin>>opt;
if(opt == 'Q')
{
scanf("%d%d",&u,&v);
int p = LCA(u, v);
int now = qRange(u, v);
if(now == 0)
{
printf("Yes\n");
continue;
}
int pp = qRange(p, p);
if(now == -1 && pp == -1)
{
printf("Yes\n");
continue;
}
if(now != 0)
{
printf("No\n");
continue;
}
}
if(opt == 'C')
{
scanf("%d%d",&u,&v);
war_cnt++;
wa[war_cnt].u = u;
wa[war_cnt].v = v;
if(deep[u] > deep[v])
updRange(u, u, -1);
else
updRange(v, v, -1);
}
if(opt == 'U')
{
scanf("%d",&x);
if(deep[wa[x].u] > deep[wa[x].v])
updRange(wa[x].u, wa[x].u, 1);
else
updRange(wa[x].v, wa[x].v, 1);
}
}
/
for(int i = 1; i <= n; i++)
cout<<qRange(i,i)<<" ";/
return 0;
}
/

7 9
1 2
1 3
3 4
5 3
7 4
4 6
C 3 1
C 3 4
Q 1 2
Q 1 4
Q 4 5
Q 6 7
U 2
Q 5 4
Q 1 5

Yes
No
No
Yes
Yes
No
*/

【luogu P3950 部落冲突】 题解的更多相关文章

  1. 【题解】Luogu P3950 部落冲突

    原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 我们用Link-Cut-Tree维护连通性(十分无脑) 一开始先把树中每条边的两端连接 U操作:把u,v两个点连起来 ...

  2. luogu P3950 部落冲突

    嘟嘟嘟 树剖板子题. #include<cstdio> #include<iostream> #include<algorithm> #include<cma ...

  3. lupgu P3950 部落冲突

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

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

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

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

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

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

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

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

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

  8. [题解] 洛谷P3950 部落冲突

    传送门 拿到题目,一看 裸LCT (其实是我懒得打,splay又臭又长) 首先,这道题的意思就是删掉一些边 所以常规操作 点权转边权 之后对于战争操作,在对应的边上+1 对于和平操作,在对应的边上-1 ...

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

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

随机推荐

  1. Oracle 数据库和Sql Server数据库的区别

    Oracle数据库的访问方式,和SqlServer数据库是有很大差别的,下面用图来说明: 1.Sql Server数据库 SqlServer数据库的访问方式,大致是:假设用户通过sa登录SqlServ ...

  2. java连接redis使用jedis带密码

    一.引入jedis的Maven配置文件 <!-- redis连接客户端jedis --> <dependency> <groupId>redis.clients&l ...

  3. jQuery遍历祖先元素:parentsUntil

    Description: Get the ancestors of each element in the current set of matched elements, up to but not ...

  4. HashMap的结构算法及代码分析

    HashMap算是日常开发中最长用的类之一了,我们应该了解它的结构跟算法: 参考文章: http://blog.csdn.net/vking_wang/article/details/14166593 ...

  5. unity的assetbundle的自动命名,以我的命名lua为例

    static string testDir = "Assets/LuaScripts/"; [MenuItem("测试/lua命名")] public stat ...

  6. Root用户让其他用户运行某程序

    这里以启动tomcat为例 1.安装tomcat不介绍了,自己百度 2.测试能否使用,略 3.创建tomcat用户 useradd tomcat -s /sbin/nologin 创建tomcat,禁 ...

  7. xss攻击汇总--转

    (1)普通的XSS JavaScript注入<SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>(2)IMG标签XSS使用JavaScr ...

  8. [转]微信小程序开发(二)图片上传+服务端接收

    本文转自:http://blog.csdn.net/sk719887916/article/details/54312573 文/YXJ 地址:http://blog.csdn.net/sk71988 ...

  9. js【jquery】 - DOM操作

    1.修改元素样式 js方式: var div2 = document.getElementById("") div2.style.width = '200px'; div2.cla ...

  10. HDU 5011 NIM博弈

    http://www.cnblogs.com/exponent/articles/2141477.html http://acm.hust.edu.cn/vjudge/contest/122814#p ...