#207. 共价大爷游长沙

链接:http://uoj.ac/problem/207

题意:给一棵树,要求支持加边、删边、询问一条边是否被所有路径覆盖。同时路径端点集合有加入与删除操作。

想法:

考虑一个点与其父亲边是否被一条路径经过。
就是该路径的一端在其子树中,另一端不在。
就是其子树中一条路径的端点出现次数为奇数。随机给一条路径两端一个权值(错误概率为$\frac{n^2}{2^w}$),然后如果一个节点子树xor值等于当前路径xor值,其到父亲边就是可行的边。

然后便是LCT维护加边,删边,子树xor值。

Code $O(n \log n)$

#include < cstdio >
#include < cstdlib >
#include < ctime > #define gec getchar
#define FILE(F) freopen(F".in","r",stdin),freopen(F".out","w",stdout)
#define DEBUG fprintf(stderr,"Passing [%s] in Line (%d)\n",__FUNCTION__,__LINE__) typedef long long ll;
typedef unsigned long long ull;
template < typename T >
inline void read(T &x)
{
x=0;bool f=0; char c=gec();
for(;c<'0'||c>'9';c=gec())f=(c=='-');
for(;c>='0'&&c<='9';c=gec())x=x*10+c-'0';
x=f?-x:x;
} const int MAXN(100010),MAXM(300010);
int n,m,u,v,x,y,X[MAXM],Y[MAXM],tp;
ull QSQ,T[MAXM]; ull Random()
{
return rand()*1ull<<30|rand();;
} namespace Link_Cut_Tree
{
struct LCT
{
int nx[2],fa,rev;
ull val,sum,light;
//val:该节点xor值; sum:其子树xor值,light:其轻儿子xor值
}tr[MAXN]; void look(int x)
{
fprintf(stderr,"x%d\n",x);
fprintf(stderr,"nx[0]%d nx[1]%d fa%d\n",tr[x].nx[0],tr[x].nx[1],tr[x].fa);
} void swap(int &x,int &y){int t(x);x=y;y=t;}
int which(int x){if(tr[tr[x].fa].nx[0]==x)return 0;if(tr[tr[x].fa].nx[1]==x)return 1;return -1;} void update(int x)
{
tr[x].sum=tr[x].val^tr[x].light;
if(tr[x].nx[0])tr[x].sum^=tr[tr[x].nx[0]].sum;
if(tr[x].nx[1])tr[x].sum^=tr[tr[x].nx[1]].sum;
} void push(int x)
{
if(!tr[x].rev)return ;
swap(tr[x].nx[0],tr[x].nx[1]);
tr[tr[x].nx[0]].rev^=1;
tr[tr[x].nx[1]].rev^=1;
tr[x].rev=0;
} void rotate(int x)
{
int fa=tr[x].fa,fafa=tr[fa].fa,xd=which(x),fd=which(fa);
tr[tr[x].nx[xd^1]].fa=fa;
tr[fa].nx[xd]=tr[x].nx[xd^1];
tr[x].nx[xd^1]=fa;tr[fa].fa=x;
tr[x].fa=fafa;if(~fd)tr[fafa].nx[fd]=x;
update(fa);
} int st[MAXN],top;
void splay(int x)
{
st[top=1]=x;
for(int t=x;~which(t);t=tr[t].fa)st[++top]=tr[t].fa;
while(top)push(st[top--]);
while(~which(x))
{
int fa=tr[x].fa;
if(~which(fa)) rotate( which(x)^which(fa)? fa : x );
rotate(x);
}
update(x);
} void access(int x)
{
for(int t=0;x;t=x,x=tr[x].fa)
{
splay(x);
int Now=tr[x].nx[1];
if(Now)tr[x].light^=tr[Now].sum;
if(t )tr[x].light^=tr[t ].sum;
tr[x].nx[1]=t; update(x);
}
} void make_root(int x)
{
access(x); splay(x); tr[x].rev^=1;
} void link(int u,int v)
{
make_root(u); access(v); splay(v);
tr[u].fa=v; tr[v].light^=tr[u].sum; update(v);
} void cut(int u,int v)
{
make_root(u); access(v); splay(u);
tr[u].nx[1]=0; tr[v].fa=0; update(u);
} void Change(int x,ull D)
{
access(x); splay(x);
tr[x].val^=D; update(x);
} bool Que(int u,int v)
{
make_root(u); access(v); splay(u);
return tr[v].sum==QSQ;
} }using namespace Link_Cut_Tree; int main()
{
#ifndef ONLINE_JUDGE
FILE("C");
#endif
int id;read(id); srand(19260817);
read(n);read(m);
for(int i=1;i<n;i++)
{
read(u);read(v);
link(u,v);
}
for(int ty,i=1;i<=m;i++)
{
read(ty);
if(ty==1)
{
read(x);read(y); cut(x,y);
read(u);read(v); link(u,v);
}else
if(ty==2)
{
++tp;
read(X[tp]);read(Y[tp]);
T[tp]=Random();QSQ^=T[tp];
Change(X[tp],T[tp]); Change(Y[tp],T[tp]);
}else
if(ty==3)
{
read(x);QSQ^=T[x];
Change(X[x],T[x]); Change(Y[x],T[x]);
}else
{
read(x);read(y);
printf(Que(x,y)?"YES\n":"NO\n");
}
}
return 0;
}

UOJ #207. 共价大爷游长沙的更多相关文章

  1. UOJ #207. 共价大爷游长沙 [lct 异或]

    #207. 共价大爷游长沙 题意:一棵树,支持加边删边,加入点对,删除点对,询问所有点对是否经过一条边 一开始一直想在边权上做文章,或者从连通分量角度考虑,比较接近正解了,但是没想到给点对分配权值所以 ...

  2. 【刷题】UOJ #207 共价大爷游长沙

    火车司机出秦川,跳蚤国王下江南,共价大爷游长沙.每个周末,勤劳的共价大爷都会开车游历长沙市. 长沙市的交通线路可以抽象成为一个 \(n\) 个点 \(n−1\) 条边的无向图,点编号为 \(1\) 到 ...

  3. [UOJ#207. 共价大爷游长沙]——LCT&随机化

    题目大意: 传送门 给一颗动态树,给出一些路径并动态修改,每次询问一条边是否被所有路径覆盖. 题解: 先%一发myy. 开始感觉不是很可做的样子,发现子树信息无论维护什么都不太对…… 然后打开题目标签 ...

  4. UOJ #207. 共价大爷游长沙(LCT + 异或哈希)

    题目 维护一颗动态树,并维护一个点对集合 \(S\) . 动态查询一条边,是否被集合中所有点对构成的路径包含. \(n \le 100000, m \le 300000\) 题解 orz 前辈 毛爷爷 ...

  5. 数据结构(动态树):UOJ 207 共价大爷游长沙

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABHwAAAJZCAIAAABUW7XHAAAgAElEQVR4nOy93cstx5Xm2f9TXh2EOe

  6. UOJ#207. 共价大爷游长沙 LCT

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ207.html 题解 第一次听说 LCT 还可以维护子树信息. 首先对于每一条路径 rand 一个值,分别 ...

  7. 【UOJ#207】共价大爷游长沙

    题目链接 题目描述 火车司机出秦川,跳蚤国王下江南,共价大爷游长沙.每个周末,勤劳的共价大爷都会开车游历长沙市. 长沙市的交通线路可以抽象成为一个 \(n\) 个点 \(n−1\) 条边的无向图,点编 ...

  8. 【UOJ207】共价大爷游长沙(Link-Cut Tree,随机化)

    [UOJ207]共价大爷游长沙(Link-Cut Tree,随机化) 题面 UOJ 题解 这题太神了 \(\%\%\%myy\) 看到动态的维护边很容易的想到了\(LCT\) 然后能否堵住一条路 我们 ...

  9. 「UOJ207」共价大爷游长沙

    「UOJ207」共价大爷游长沙 解题思路 : 快速判断两个集合是否完全相等可以随机点权 \(\text{xor}\) 的思路可以用到这道题上面,给每一条路径随机一个点权,维护出经过每一条边的点权的 \ ...

随机推荐

  1. lintcode - 删除数字

    class Solution { public: /* * @param A: A positive integer which has N digits, A is a string * @para ...

  2. WireShark抓包分析(二)

    简述:本文介绍了抓包数据含义,有TCP报文.Http报文.DNS报文.如有错误,欢迎指正. 1.TCP报文 TCP:(TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP ...

  3. hdu 6287

    选出来比较合适的博客 https://blog.csdn.net/Tony5t4rk/article/details/80490711 https://blog.csdn.net/Game_Acm/a ...

  4. firewall 端口转发

    centos 7 使用背景:某次新购阿里云服务器安装nginx后配置80转8080的内部转发 systemctl status firewalld ---查看守护进程状态systemctl start ...

  5. my.梦幻手游_XP

    1.http://my.netease.com/thread-459708-1-1.html 2. 3.

  6. 转 sql profile 绑定 litera and move profile to another db l for spa

    SQL TYPE 1:for bind value sql , first create a good plan with literal and with good  profile. then u ...

  7. inventor安装失败怎样卸载安装inventor 2019?

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  8. maya2018安装失败如何卸载重装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  9. /proc/sys/net/ipv4/下各参数含义

    net.ipv4.tcp_tw_reuse = 0 表示开启重用.允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭 net.ipv4.tcp_tw_recycle = ...

  10. Java基础12-数组求最大值以及排序

    1.求最大值 实例:小明买手机,询问了4家店的价格,分别是2800,2900,2600,3000,输出最低价 正确代码:类似打擂台,将数组第一个值赋给最小值,然后依次比较 import java.ut ...