【luogu P3950 部落冲突】 题解
题目连接: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 部落冲突】 题解的更多相关文章
- 【题解】Luogu P3950 部落冲突
原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 我们用Link-Cut-Tree维护连通性(十分无脑) 一开始先把树中每条边的两端连接 U操作:把u,v两个点连起来 ...
- luogu P3950 部落冲突
嘟嘟嘟 树剖板子题. #include<cstdio> #include<iostream> #include<algorithm> #include<cma ...
- lupgu P3950 部落冲突
题目链接 luogu P3950 部落冲突 题解 树剖线段树可以 lct还行 代码 #include<cstdio> #include<algorithm> inline in ...
- 洛谷 P3950 部落冲突 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例1 输出样例1 输入样例2 输出样例2 输入样例3 输出样例3 说明 思路 AC代码 总结 题面 题目链接 P3 ...
- 洛谷P3950 部落冲突 [LCT]
题目传送门 部落冲突 格式难调,体面就不放了. 分析: julao们应该都看得出来就是个$LCT$板子,战争就$cut$,结束就$link$,询问就$find$.没了... 太久没打$LCT$,然后发 ...
- luogu题解 P3950部落冲突--树链剖分
题目链接 https://www.luogu.org/problemnew/show/P3950 分析 大佬都用LCT,我太弱只会树链剖分 一个很裸的维护边权树链剖分题.按照套路,对于一条边\(< ...
- 【Luogu】P3950部落冲突(树链剖分)
题目链接 状态奇差无比,sbt都能错一遍. 不动笔光想没有想到怎么做,画图之后发现一个很明显的性质…… 那就是两个开战的部落,其中一个是另一个的父亲. 所以在儿子那里加个权值.查询的时候树链剖分查询链 ...
- [题解] 洛谷P3950 部落冲突
传送门 拿到题目,一看 裸LCT (其实是我懒得打,splay又臭又长) 首先,这道题的意思就是删掉一些边 所以常规操作 点权转边权 之后对于战争操作,在对应的边上+1 对于和平操作,在对应的边上-1 ...
- 【刷题】洛谷 P3950 部落冲突
题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多 ...
随机推荐
- nodejs(二) --- 重要知识点回顾
1. 运行一个nodejs文件, 如一个js文件中只含有console.log("hello world");的文件,我们再git里运行node,即 node hello.js 即 ...
- DBNull.Value.ToString() == string.Empty
Console.WriteLine(DBNull.Value.ToString() == string.Empty); //True
- 8086实时时钟实验(一)——《x86汇编语言:从实模式到保护模式》05
1.代码清单 ;代码清单9-1 ;文件名:c09_1.asm ;文件说明:用户程序 ;创建日期:2011-4-16 22:03 ;=================================== ...
- 【Linux相识相知】rpm包管理
我们日常在使用Windows的时候,如果要安装某个软件,最简单的方法就是在程序包的官网直接下载软件包到本地,一般是以.exe或者.msi格式的文件,然后一直下一步下一步就能安装成功了,但是在使用lin ...
- WPF的依赖项属性
WPF的依赖项属性 属性与事件是.NET抽象模型的核心部分.WPF使用了更高级的依赖项属性(Dependency Property)功能来替换原来.NET的属性,实现了更高效率的保存机制,还添加了附加 ...
- common-jdbc:一个基于SpringJdbcTemplate的高性能数据库操作工具类库
项目地址:https://gitee.com/cnsugar/common-jdbc 一.简介 基于SpringJdbcTemplate的高性能数据库操作工具类库,支持mysql.oracle数据库, ...
- C#学习笔记10
1.匿名类型:匿名类型是C#3.0新增的特性,是强类型(由编译器后台在生成为CIL时,自动声明的代码定义类型),声明与初始化属性后其属性是尽读属性.只有在属性的名称.顺序.类型一致时,多个声明匿名变量 ...
- PAT 1053 Path of Equal Weight
#include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> ...
- PHP基础--strtr和str_replace字符替换函数
(一)strtr是字符替换函数 (1)单个字符替换: <?php echo strtr("abba", "ab", "10"),&qu ...
- Not able to find Java executable or version转载
转载地址:https://blog.csdn.net/qq_40902122/article/details/79437991 findstr' 不是内部或外部命令,也不是可运行的程序或批处理文件.N ...