[题解] 洛谷P3950 部落冲突
拿到题目,一看 裸LCT (其实是我懒得打,splay又臭又长)
首先,这道题的意思就是删掉一些边
所以常规操作 点权转边权
之后对于战争操作,在对应的边上+1
对于和平操作,在对应的边上-1
然后对于询问,即统计从\(u\)到\(v\)的路径上的和
如果和为\(0\),即表明可以到,否则不能到
#include<bits/stdc++.h>
namespace my_std
{
using namespace std;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define drep(i,a,b) for (int i=(a);i>=(b);i--)
#define go(u) for (int i=head[(u)];i;i=e[i].nxt)
#define pf printf
#define writeln(x) write(x),putchar('\n')
#define writesp(x) write(x),putchar(' ')
#define mem(x,v) memset(x,v,sizeof(x))
typedef long long ll;
const int INF=0x7fffffff;
inline int read()
{
int sum=0,f=1;
char c=0;
while (!isdigit(c))
{
if (c=='-') f=-1;
c=getchar();
}
while (isdigit(c))
{
sum=(sum<<1)+(sum<<3)+(c^48);
c=getchar();
}
return sum*f;
}
void write(int k)
{
if (k<0) putchar('-'),k=-k;
if (k>=10) write(k/10);
putchar(k%10+'0');
}
}
using namespace my_std;
const int N=300010;
int n,quiz,cnt,tree[N],head[N];
int son[N],top[N],size[N];
int idx,in[N],num[N],f[N],dep[N];
struct edge
{
int to,nxt;
}e[N<<1];
struct node
{
int x,y;
}a[N];
#define lowbit(x) (x&(-x))
void update(int x,int y)
{
while (x<=n)
{
tree[x]+=y;
x+=lowbit(x);
}
}
int getsum(int x)
{
int res=0;
while (x>0)
{
res+=tree[x];
x-=lowbit(x);
}
return res;
}
int query(int l,int r)
{
return getsum(r)-getsum(l-1);
}
void add(int u,int v)
{
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void dfs1(int u,int fa)
{
dep[u]=dep[fa]+1;
f[u]=fa;
size[u]=1;
go(u)
{
int v=e[i].to;
if (v==fa) continue;
dfs1(v,u);
size[u]+=size[v];
if (size[son[u]]<size[v])
{
son[u]=v;
}
}
}
void dfs2(int u,int t)
{
in[u]=++idx;
num[idx]=u;
top[u]=t;
if (son[u]==0) return;
dfs2(son[u],t);
go(u)
{
int v=e[i].to;
if (v==f[u]||v==son[u]) continue;
dfs2(v,v);
}
}
int query_tree(int x,int y)
{
int res=0;
while (top[x]!=top[y])
{
if (dep[top[x]]<dep[top[y]]) swap(x,y);
res+=query(in[top[x]],in[x]);
x=f[top[x]];
}
if (dep[x]<dep[y]) swap(x,y);
res+=query(in[y]+1,in[x]);
return res;
}
int main()
{
n=read(),quiz=read();
int u,v;
rep(i,1,n-1)
{
u=read(),v=read();
add(u,v),add(v,u);
}
dfs1(1,0);
dfs2(1,1);
char opt;
int p,q;
cnt=0;
rep(i,1,quiz)
{
scanf("%s",&opt);
if (opt=='Q')
{
p=read(),q=read();
int res=query_tree(p,q);
if (res==0) pf ("Yes\n");
else pf ("No\n");
}
if (opt=='C')
{
p=read(),q=read();
if (dep[p]<dep[q]) swap(p,q);
update(in[p],1);
a[++cnt].x=p;
a[cnt].y=q;
}
if (opt=='U')
{
p=read();
update(in[a[p].x],-1);
}
}
}
[题解] 洛谷P3950 部落冲突的更多相关文章
- 洛谷 P3950 部落冲突 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例1 输出样例1 输入样例2 输出样例2 输入样例3 输出样例3 说明 思路 AC代码 总结 题面 题目链接 P3 ...
- 洛谷P3950 部落冲突(LCT)
洛谷题目传送门 最无脑LCT题解,Dalao们的各种算法都比这个好多啦... 唯一的好处就是只管码代码就好了 开战cut,停战link,询问findroot判连通性 太无脑,应该不用打注释了.常数大就 ...
- 洛谷P3950 部落冲突 [LCT]
题目传送门 部落冲突 格式难调,体面就不放了. 分析: julao们应该都看得出来就是个$LCT$板子,战争就$cut$,结束就$link$,询问就$find$.没了... 太久没打$LCT$,然后发 ...
- 【刷题】洛谷 P3950 部落冲突
题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多 ...
- [洛谷P3950]部落冲突
题目大意:给你一棵树,有$3$个操作: $Q\;p\;q:$询问$p,q$是否连通 $C\;p\;q:$把$p->q$这条边割断 $U\;x:$恢复第$x$次操作二 题解:可以在割断时把这条边赋 ...
- 洛谷:P3950 部落冲突
原题地址:https://www.luogu.org/problemnew/show/P3950 题目简述 给定一棵树,每次给定一个操作,有如下两种: 将某条边染黑 2.询问给定的u,v两点间是否有边 ...
- Cogs 2856. [洛谷U14475]部落冲突
2856. [洛谷U14475]部落冲突 ★★★ 输入文件:lct.in 输出文件:lct.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 在一个叫做Travi ...
- 洛谷 U14475 部落冲突 【比赛】 【树链剖分 + 线段树】
题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多 ...
- 【题解】Luogu P3950 部落冲突
原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 我们用Link-Cut-Tree维护连通性(十分无脑) 一开始先把树中每条边的两端连接 U操作:把u,v两个点连起来 ...
随机推荐
- Java For 循环
章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...
- Linux镜像源 国内列表
(一).企业站 1.搜狐:http://mirrors.sohu.com/ 2.网易:http://mirrors.163.com/ 3.阿里云:http://mirrors.aliyun.com/ ...
- Good Bye 2019
A.Card Game 题目大意:两个人都有共有n张卡牌,每张卡牌上都有一个数xi,没有两张牌上的数相同,且xi不小于1不大于n.每次两个人选出一张牌来,牌上数字大的人赢得此局,如果谁最后手上拥有所有 ...
- Gym - 101158C Distribution Center
题意:n个传送带,传送带i运送编号为i的物品,机器人可以负责把传送带i上的物品放到传送带i + 1上,也可以把传送带i + 1上的物品放到传送带i上,机器人分布在传送带上x轴的不同位置,问每个传送带最 ...
- (转载)wchar_t类型和char类型变量相互转换
转载连接:https://www.cnblogs.com/zhangdewang/p/11420410.html和https://www.cnblogs.com/lanhaicode/p/105742 ...
- 用 Python 编写一个天气查询应用 pyqt5
效果预览: ! 一.获取天气信息 使用python获取天气有两种方式. 1)是通过爬虫的方式获取天气预报网站的HTML页面,然后使用xpath或者bs4解析HTML界面的内容. 2)另一种 ...
- javascript中window.open()与window.location.href
1.window.location是window对象的属性,而window.open是window对象的方法 window.location是你对当前浏览器窗口的URL地址对象的参考! ...
- 十一、SAP文本变量,并设置长度
一.在SAP中,一个中文占用2个文本长度,详见代码: 二.效果如下
- 104-PHP定义并实例化类
<?php class ren{ //定义人类 } class mao{ //定义猫类 } echo '实例化一个人类:'; var_dump(new ren()); //实例化人类 echo ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-flag
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...