题目连接: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. Linux定时任务与开机自启动脚本(cron与crontab)

    开机自启动脚本 网上常见的脚本开机自启方法是: 假设要自启的脚本位于 /home/user/test.sh 给脚本可执行的权限 sudo chmod +x /home/user/test.sh 将脚本 ...

  2. python实现excel转json的例子

    python实现excel转json的例子(改进版) 由于数值策划给出数值是excel表格,但前台flash程序用的又是json格式.服务器也用了json格式,而json又是utf-8编码的,用C++ ...

  3. VMWare启动虚拟机失败,提示锁定文件失败解决方法

    1.问题描述:未正常关闭虚拟机,重新启动时,VMWare启动虚拟机失败 2.解决方法: ①找到该虚拟系统所在的目录,即弹出框中的目录,在目录中找到Windows XP Professional.vmx ...

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

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

  5. CheckBoxList

    CheckBoxList 控件基本用法 定义和用法 CheckBoxList 控件用来建立一个多选的复选框组. CheckBoxList 控件中的每个可选项由一个 ListItem 元素来定义! 提示 ...

  6. html-框架标签的使用

    <frameset> - rows:按照行进行划分 ** <frameset rows="80,*"> - cols:按照列进行划分 ** <fram ...

  7. Ubuntu真机安装

    Ubuntu真机安装 1.Ubuntu安装: (1)启动盘制作: a.下载启动盘制作工具Universal USB Installe,下载地址: b.下载Ubuntu系统镜像,到本地磁盘,官方下载地址 ...

  8. [PAMI 2018] Differential Geometry in Edge Detection: accurate estimation of position, orientation and curvature

    铛铛铛,我的第一篇文章终于上线了,过程曲折,太不容易了--欢迎访问--- https://ieeexplore.ieee.org/document/8382271/ 后面有需要的话可以更新一下介绍,毕 ...

  9. Mybatis 的多个数据源

    主要思路: DataSource --> SqlSessionFactory --> SqlSessionTemplate 第一方式: 定义多套  DataSource --> Sq ...

  10. vs2010的帮助文档

    系统重装了,发现vs2010的帮助无论如何都是web方式,这种体验很差劲. google了才明白,原来是ms发展过程的一个败笔. 需要升级到vs2010 sp1才会有跟以前一样的帮助系统. 彻底无语了 ...