题目大意:

  传送门

  给一颗动态树,给出一些路径并动态修改,每次询问一条边是否被所有路径覆盖。

题解:

  先%一发myy。

  开始感觉不是很可做的样子,发现子树信息无论维护什么都不太对……

  然后打开题目标签……随机化……

  emmmm,突然想到[bzoj 3569]DZY loves Chinese II……

  随机大法好…

  给每条路径随机一个权值,然后用异或来统计子树权值和,并与全集的异或和做下比较,然后就是LCT大板子……

  板子写挂……wa了两遍……迷。

代码:

 #include "bits/stdc++.h"

 inline int read(){
int s=,k=;char ch=getchar();
while (ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while (ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
} using namespace std; const int N=2e5+; namespace LCT{
#define rev(t) (t?t->rev^=1:0)
#define is_root(t) (!t->fa||(t->fa->son[0]!=t&&t->fa->son[1]!=t))
#define son(t) (t->fa->son[1]==t)
#define size(t) (t?t->size:0)
struct node{
node *fa,*son[];
int rev,size,empty;
node () {fa=son[]=son[]=NULL,empty=rev=size=;}
inline void update(){
size=size(son[])^size(son[])^empty;
}
inline void pushdown(){
if (!rev) return ;
rev(son[]),rev(son[]);
swap(son[],son[]);rev=;
}
}tree[N/],*tmp[N/]; inline void rotate(node *p){
int a=son(p)^;node *f=p->fa;
f->son[a^]=p->son[a];
if (p->son[a]) p->son[a]->fa=f;
p->fa=f->fa;
if (!is_root(f)) f->fa->son[son(f)]=p;
f->fa=p,p->son[a]=f,f->update(),p->update();
} inline void update(node *p){
if (!is_root(p)) update(p->fa);
p->pushdown();
} inline void splay(node *p){
register int pos=;
for(node *t=p;;t=t->fa){
tmp[++pos]=t;
if(is_root(t)) break;
}
for(;pos;--pos) tmp[pos]->pushdown();
for(;!is_root(p);rotate(p))
if(!is_root(p->fa)) rotate(son(p)==son(p->fa)?p->fa:p);
} inline void access(node *p){
for(node *pre=NULL;p;pre=p,p=p->fa)
splay(p),p->empty^=size(p->son[])^size(pre),p->son[]=pre,p->update();
} inline void make_root(node *x) {
access(x),splay(x),x->rev^=;
} inline void link(node *x,node *y) {
make_root(x);access(y),splay(y),x->fa=y;
y->empty^=size(x),y->update();
} inline void cut(node *x,node *y){
make_root(x),access(y),splay(y);
x->fa=y->son[]=NULL;y->update();
} inline int query(node *x,node *y) {
make_root(x);access(y),splay(y);
return size(x);
}
} int n,m;
int a[N],b[N],c[N],cnt,tot; int main (int argc, char const* argv[]){
//freopen("207.in","r",stdin);
read();
srand();
n=read(),m=read();
register int i;
using namespace LCT;
for (i=;i<n;++i) {
int x=read(),y=read();
link(tree+x,tree+y);
}
int type,x,y,u,v;
while (m--) {
type=read();
switch (type) {
case : x=read(),y=read(),u=read(),v=read(),cut(tree+x,tree+y),link(tree+u,tree+v);
break;
case : x=read(),y=read(),u=rand();
make_root(&tree[x]),tree[x].empty^=u,tree[x].update(),
make_root(&tree[y]),tree[y].empty^=u,tree[y].update();
++cnt,a[cnt]=x,b[cnt]=y,c[cnt]=u,tot^=u;
break;
case : x=read();u=c[x],y=b[x],x=a[x];
make_root(&tree[x]),tree[x].empty^=u,tree[x].update(),
make_root(&tree[y]),tree[y].empty^=u,tree[y].update();
tot^=u;
break;
case : x=read(),y=read();
printf("%s\n",tot==query(tree+x,tree+y)?"YES":"NO");
break;
}
}
}

[UOJ#207. 共价大爷游长沙]——LCT&随机化的更多相关文章

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

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

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

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

  3. UOJ #207. 共价大爷游长沙

    #207. 共价大爷游长沙 链接:http://uoj.ac/problem/207 题意:给一棵树,要求支持加边.删边.询问一条边是否被所有路径覆盖.同时路径端点集合有加入与删除操作. 想法: 考虑 ...

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

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

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

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

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

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABHwAAAJZCAIAAABUW7XHAAAgAElEQVR4nOy93cstx5Xm2f9TXh2EOe

  7. 共价大爷游长沙 lct 维护子树信息

    这个题目的关键就是判断 大爷所有可能会走的路 会不会经过询问的边. 某一条路径经过其中的一条边, 那么2个端点是在这条边的2测的. 现在我们要判断所有的路径是不是都经过 u -> v 我们以u为 ...

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

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

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

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

随机推荐

  1. 遍历输出图片加hover

    1. $(".icon a>div").hover(function () { var slls = $(this).attr("class"); sll ...

  2. 解析Json字符串的三种方法

    在很多时候,我们的需要将类似 json 格式的字符串数据转为json, 下面将介绍日常中使用的三种解析json字符串的方法 1.首先,我们先看一下什么是 json 格式字符串数据,很简单,就是 jso ...

  3. Python 可视化TVTK CubeSource管线初使用

    CubeSource对象是长方体数据源对象.本次在安装成功TVTK库的基础上显示一个长方体对象.通过以下代码,我们设置一个长宽高分别为1.0,2.0,3.0的长方体数据源并通过管线显示出来. from ...

  4. 10.API 接口自动化测试的基本原理

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 28.0px Helvetica } p.p2 { margin: 0.0px 0.0px 0.0px 0. ...

  5. HBase最佳实践 - 集群规划

    本文由  网易云发布. 作者:范欣欣 本篇文章仅限本站分享,如需转载,请联系网易获取授权. HBase自身具有极好的扩展性,也因此,构建扩展集群是它的天生强项之一.在实际线上应用中很多业务都运行在一个 ...

  6. Codeforces Round #479 (Div. 3) A. Wrong Subtraction

    题目网址:http://codeforces.com/contest/977/problem/A 题解:给你一个数n,进行k次变换,从末尾开始-1,512变成511,511变成510,510会把0消掉 ...

  7. C#文件和字节流的转换方法

    1.读取文件,并转换为字节流 FileStream fs = new FileStream(filename,FileMode.Open,FileAccess.Read); byte[] infbyt ...

  8. 大型三甲医院医疗体检信息管理系统源码 PEIS 体检科软件 CS

    详情请点击查看 开发环境 :VS2008 + C# + SQL2000 功能介绍: 1:设置:操作员设置   系统功能设置    用户组权限设置  公告打印设置  数据字典设置  临床类型设置  体检 ...

  9. PHP session有效期session.gc_maxlifetime详解

    一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的sessio ...

  10. JavaScript对json操作小记

    JSON是一种轻量级的数据交换格式,同时,JSON是 JavaScript 原生格式,因此我们可以直接处理它不需要依赖任何工具包或者插件.因此,好多后台都会选择返回给前端这种非常友好的数据格式. 引子 ...