uoj207共价大爷游长沙
话说我可能还没有调出魔法森林呢。。。说好的lct第一题呢。。。
又是一个随机化的方法,毕竟又是判定性的问题
上次是判断无向图联通
这次是判断一些路径是否经过一条定边
若把路径上的边全部异或上一个路径的权值
只要判断这条边的权值是否是所有路径的权值异或和就没了
lct维护链上异或和就好了
#include<bits/stdc++.h>
#define MAXN 100010
#define MAXM 300010
#define ll long long
using namespace std;
int fa[MAXN],son[MAXN][],siz[MAXN],pe[MAXN],ne[MAXN],fe[MAXN],le[MAXN],sum[MAXN],ch[MAXN];
int val[MAXN+MAXM];
bool rev[MAXN];
int st[MAXN],tp;
int v[MAXM],v1[MAXM],v2[MAXM],cnt;
int n,m;
int S;
int tot;
int rd()
{
if(RAND_MAX==) return (rand()<<)+rand();
else return rand();
}
bool ir(int x)
{
return son[fa[x]][]!=x&&son[fa[x]][]!=x;
}
void ud(int x)
{
siz[x]=siz[son[x][]]+siz[son[x][]]+;
sum[x]=;
fe[x]=pe[x];
le[x]=ne[x];
if(son[x][])
{
sum[x]^=sum[son[x][]]^val[pe[x]];
fe[x]=fe[son[x][]];
}
if(son[x][])
{
sum[x]^=sum[son[x][]]^val[ne[x]];
le[x]=le[son[x][]];
}
}
void torev(int x)
{
if(!x)
return;
swap(son[x][],son[x][]);
swap(pe[x],ne[x]);
swap(fe[x],le[x]);
rev[x]^=;
}
void toch(int x,int y)
{
if(!x)
return;
if(siz[x]&^)
sum[x]^=y;
if(son[x][])
val[pe[x]]^=y;
if(son[x][])
val[ne[x]]^=y;
ch[x]^=y;
}
void pd(int x)
{
if(rev[x])
{
torev(son[x][]);
torev(son[x][]);
rev[x]=;
}
if(ch[x])
{
toch(son[x][],ch[x]);
toch(son[x][],ch[x]);
ch[x]=;
}
}
void cot(int x,int y,int z)
{
if(x)
fa[x]=y;
if(y)
son[y][z]=x;
}
void rot(int x,bool z)
{
int xx=fa[x],xxx=fa[xx];
cot(son[x][z],xx,z^);
if(ir(xx))
fa[x]=xxx;
else
cot(x,xxx,son[xxx][]==xx);
cot(xx,x,z);
ud(xx);
}
void apd(int x)
{
int i;
st[++tp]=x;
for(i=x;!ir(i);i=fa[i])
st[++tp]=fa[i];
for(;tp;tp--)
pd(st[tp]);
}
void splay(int x)
{
apd(x);
while(!ir(x))
{
int xx=fa[x],xxx=fa[xx];
if(ir(xx))
rot(x,son[xx][]==x);
else
{
bool z=son[xxx][]==xx;
if(son[xx][z]==x)
{
rot(x,z^);
rot(x,z);
}
else
{
rot(xx,z);
rot(x,z);
}
}
}
ud(x);
}
void acs(int x)
{
int t=;
while(x)
{
splay(x);
son[x][]=t;
ne[x]=fe[t];
ud(x);
t=x;
x=fa[x];
}
}
void reboot(int x)
{
acs(x);
splay(x);
torev(x);
}
void link(int x,int y,int z)
{
reboot(x);
fa[x]=y;
pe[x]=z;
}
void pick(int x,int y)
{
reboot(y);
acs(x);
splay(x);
}
void cut(int x,int y)
{
pick(x,y);
son[x][]=fa[y]=;
pe[x]=fe[x]=ne[y]=le[y]=;
ud(x);
ud(y);
}
int ask(int x,int y)
{
pick(x,y);
return sum[x];
}
void change(int x,int y,int z)
{
pick(x,y);
toch(x,z);
}
int main()
{
int i,o,x,y,z,xx,yy;
srand(time());
scanf("%*d%d%d",&n,&m);
for(i=;i<=n;i++)
siz[i]=;
for(i=;i<n;i++)
{
scanf("%d%d",&x,&y);
link(x,y,++tot);
}
while(m--)
{
int cmd;
scanf("%d",&cmd);
if(cmd==)
{
scanf("%d%d%d%d",&x,&y,&xx,&yy);
z=ask(x,y);
cut(x,y);
link(xx,yy,++tot);
change(x,y,z);
}
if(cmd==)
{
cnt++;
scanf("%d%d",&v1[cnt],&v2[cnt]);
v[cnt]=rd();
S^=v[cnt];
change(v1[cnt],v2[cnt],v[cnt]);
}
if(cmd==)
scanf("%d",&x),
S^=v[x],
change(v1[x],v2[x],v[x]);
if(cmd==)
scanf("%d%d",&x,&y),
puts(ask(x,y)==S?"YES":"NO");
}
return ;
}
uoj207共价大爷游长沙的更多相关文章
- [UOJ207]共价大爷游长沙
UOJ sol 这题真是太神啦! 对于S集合中的每个点对,给他们随机附上一个相同权值. 两个点在边(x,y)的两侧当且仅当一个点在x的子树中,另一个点不在x的子树中(假设x是y的儿子) 维护一下子树点 ...
- uoj207 共价大爷游长沙 子树信息 LCT + 随机化 + 路径覆盖
题目传送门 http://uoj.ac/problem/207 题解 如果是一棵静态的树,有一个非常容易想到的算法:统计一下目前的每一个条边被几条路径经过,如果 \(x\) 到 \(y\) 的边的这个 ...
- 【LCT维护子树信息】uoj207 共价大爷游长沙
这道题思路方面就不多讲了,主要是通过这题学一下lct维护子树信息. lct某节点u的子树信息由其重链的一棵splay上信息和若干轻儿子子树信息合并而成. splay是有子树结构的,可以在rotate, ...
- 【UOJ207】共价大爷游长沙(Link-Cut Tree,随机化)
[UOJ207]共价大爷游长沙(Link-Cut Tree,随机化) 题面 UOJ 题解 这题太神了 \(\%\%\%myy\) 看到动态的维护边很容易的想到了\(LCT\) 然后能否堵住一条路 我们 ...
- 「UOJ207」共价大爷游长沙
「UOJ207」共价大爷游长沙 解题思路 : 快速判断两个集合是否完全相等可以随机点权 \(\text{xor}\) 的思路可以用到这道题上面,给每一条路径随机一个点权,维护出经过每一条边的点权的 \ ...
- UOJ #207. 共价大爷游长沙 [lct 异或]
#207. 共价大爷游长沙 题意:一棵树,支持加边删边,加入点对,删除点对,询问所有点对是否经过一条边 一开始一直想在边权上做文章,或者从连通分量角度考虑,比较接近正解了,但是没想到给点对分配权值所以 ...
- 【刷题】UOJ #207 共价大爷游长沙
火车司机出秦川,跳蚤国王下江南,共价大爷游长沙.每个周末,勤劳的共价大爷都会开车游历长沙市. 长沙市的交通线路可以抽象成为一个 \(n\) 个点 \(n−1\) 条边的无向图,点编号为 \(1\) 到 ...
- UOJ #207. 共价大爷游长沙
#207. 共价大爷游长沙 链接:http://uoj.ac/problem/207 题意:给一棵树,要求支持加边.删边.询问一条边是否被所有路径覆盖.同时路径端点集合有加入与删除操作. 想法: 考虑 ...
- 【UOJ#207】共价大爷游长沙
题目链接 题目描述 火车司机出秦川,跳蚤国王下江南,共价大爷游长沙.每个周末,勤劳的共价大爷都会开车游历长沙市. 长沙市的交通线路可以抽象成为一个 \(n\) 个点 \(n−1\) 条边的无向图,点编 ...
随机推荐
- 高并发压力下导致数据库bug
环境信息: linux 6.1 + oracle11.2.0.3 RAC 问题现象: 学校晚上6点选课,人数大概有3000,7点时,数据库报错如下(数据库到6点多还是可以连接的),数据库hu ...
- Java常用类Date、Calendar、SimpleDateFormat详解
Date类 java.util 包提供了 Date 类来封装当前的日期和时间,Date 类提供两个构造函数来实例化 Date 对象 第一个构造函数使用当前日期和时间来初始化对象 Date( ) 第 ...
- Ubuntu16.04上安装arm-linux-gcc4.4.3
一.首先下载arm-linux-gcc-4.4.3.tar.gz安装包,安装包地址: http://www.cr173.com/soft/42654.html 二.解压安装包: sudo tar -z ...
- Chapter2 二分与三分
T1 给一个N个数的序列,分成M段,每段最大值最小 sol:二分最大值,贪心Check T2 平面上n个点,每个点每s会向周围扩散一个单位长度,两个点联通当且仅当扩散有交点,问什么时候这n个点联通 s ...
- javacpp-FFmpeg系列补充:FFmpeg拉流截图实现在线演示demo(视频截图并返回base64图像,支持jpg/png/gif/bmp等多种格式)
javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...
- dubbo的防痴呆设计
项目中也经常会遇到各种因为配置而引入的问题,很多技术支持解决不掉就找开发,结果发现大部分还是配置错误或网络不通等.如果在设计之初就能考虑到并针对这些问题做出应对设计,甚至给出异常的解决方案,确实可以减 ...
- loj 6089 小 Y 的背包计数问题——分类进行的背包
题目:https://loj.ac/problem/6089 直接多重背包,加上分剩余类的前缀和还是n^2的. 但可发现当体积>sqrt(n)时,个数的限制形同虚设,且最多有sqrt(n)个物品 ...
- WPF Get Multibinding Expression, Update Source,
wpf 拿到某个control的multibinding以及其中每个Binding 1. 拿到multibinding MultiBindingExpression mbe = Bindin ...
- Spring读取加密属性文件处理--待整理
引言:Spring框架俨然已经是目前Java WEB项目开发的一个宠儿,更有人将Spring, Struts,和Hibernage称之为Java WEB项目开发的3件利器.Spring的依赖.注入.A ...
- Python中正则匹配使用findall时的注意事项
在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串 "123@qq.comaaa@163.combbb@126.comasdf111@a ...