题目连接: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. OJ (Online Judge)使用

    这是一种方式,我们还可使用另外一种方式: process.stdin.resume(); process.stdin.setEncoding('ascii'); var input = "& ...

  2. Kettle集群部署(1台Windows主机和2台Linux服务器)

    不多说,直接上干货! http://blog.csdn.net/jianglushou9763/article/details/70859616

  3. pat02-线性结构3. 求前缀表达式的值(25)

    02-线性结构3. 求前缀表达式的值(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法.中缀表示法和后缀表示法 ...

  4. css三角块

    html: <div class="angle"></div> css: .angle{ width: 0px; height: 0px; border-b ...

  5. 深入理解JavaScript系列(3):全面解析Module模式

    简介 Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级使用方式. 首先我们来看看Module模式的基本特征: 模块化,可 ...

  6. js判断下拉框改变状态

    <script> $('#questSort').change(function(){ //此处写状态改变要实现的功能 var s=$('#questSort').children('op ...

  7. 2017年10月29日 数据库查询总结&45道题

    日期函数: 当前时间:GetDate() 两个时间差:DateDiff() 一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Tea ...

  8. 【Q】类和对象:游戏角色开发(角色介绍)

    案例情景:某公司要开发新游戏,请用面向对象的思想设计英雄类.怪物类和武器类. 编写测试类,创建英雄对象.怪物对象和武器对象,并输出各自的信息. 其中设定分别如下: 1.英雄类 属性:英雄名字.生命值. ...

  9. C# ObjectArx cad二次开发

    1 环境搭建:安装CAD 和objectArx库,这里安装的是cad2012和objectArx2010 ,vs是2010 2 新建一个类库项目,引用objectArx安装目录下inc文件夹下的AcD ...

  10. 【设计模式】template method(模板方法)-- 类行为型模式5.10

    1.意图 子类在不改变父类的算法结构的情况下,可以重定义算法的某些特定步骤 2.动机 模板方法用一些抽象的操作定义一个算法,子类重定义这些操作以提供具体的行为:步骤的顺序定了,但实现可以调整: 3.适 ...