传送门

题意:维护一棵无权树和一个路径集合SSS,支持以下操作:

  1. 断边连边
  2. 在SSS加入中加入一条路径
  3. 删除SSS中的一条路径
  4. 询问是否SSS中的所有路径都经过了边(x,y)(x,y)(x,y)

n≤105,q≤3×105n\leq10^5,q\leq3\times10^5n≤105,q≤3×105

给每条加入的路径随机赋一个权值并把端点异或上这个权值

这样如果所有路径都跨越了uuu的子树,uuu子树的异或和就等于所有路径的异或和

用LCT维护

出错的可能性是有若干条子树内或外的路径异或起来等于000,这个概率与路径条数无关,为1V\frac{1}{V}V1​(VVV为随机的值域)

当在int范围内随机时,3×1053\times 10^53×105次询问都不出错的概率约为99.986%99.986\%99.986%,可以通过

复杂度O(nlog⁡n)O(n\log n)O(nlogn)

注意link的时候要split(即把yyy变成辅助树上的真根),因为虚子树会影响yyy祖先的信息

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cstdlib>
#define MAXN 100005
#define MAXM 300005
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
inline int Rand(){return (rand()<<15)^rand();}
int ch[MAXN][2],fa[MAXN],rv[MAXN],val[MAXN],s[MAXN],si[MAXN];
inline void update(int x){s[x]=val[x]^s[ch[x][0]]^s[ch[x][1]]^si[x];}
inline void pushr(int x){swap(ch[x][0],ch[x][1]);rv[x]^=1;}
inline void pushdown(int x)
{if (rv[x]){if (ch[x][0]) pushr(ch[x][0]);if (ch[x][1]) pushr(ch[x][1]);rv[x]=0;   }
}
inline bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
inline int get(int x){return ch[fa[x]][1]==x;}
inline void rotate(int x)
{int y=fa[x],z=fa[y];int l=get(x),r=l^1;int w=ch[x][r];if (!isroot(y)) ch[z][get(y)]=x;ch[x][r]=y,ch[y][l]=w;if (w) fa[w]=y;fa[y]=x,fa[x]=z;update(y),update(x);
}
int q[MAXN],tp;
inline void splay(int x)
{q[tp=1]=x;for (int i=x;i;i=fa[i]) q[++tp]=fa[i];for (int i=tp;i>=1;i--) pushdown(q[i]);while (!isroot(x)){int y=fa[x];if (!isroot(y)){if (get(x)==get(y)) rotate(y);else rotate(x);}rotate(x);}
}
inline void access(int x)
{for (int y=0;x;y=x,x=fa[x]){splay(x);si[x]^=s[ch[x][1]];si[x]^=s[ch[x][1]=y];update(x);}
}
inline void evert(int x){access(x),splay(x),pushr(x);}
inline void split(int x,int y){evert(x),access(y),splay(y);}
inline void link(int x,int y){split(x,y),fa[x]=y,si[y]^=s[x],update(y);}
inline void cut(int x,int y){split(x,y);ch[y][0]=fa[x]=0;update(y);}
inline int query(int x,int y){split(x,y);return si[y]^val[y];}
inline void modify(int x,int v){access(x),splay(x),val[x]^=v,update(x);}
int x[MAXM],y[MAXM],v[MAXM],cur,cnt;
int main()
{read();int n,m;n=read(),m=read();for (int i=1;i<n;i++){int u,v;u=read(),v=read();link(u,v);}while (m--){int type=read();if (type==1){int x,y,u,v;x=read(),y=read(),u=read(),v=read();cut(x,y),link(u,v);}if (type==2){++cnt;x[cnt]=read(),y[cnt]=read(),v[cnt]=Rand();modify(x[cnt],v[cnt]),modify(y[cnt],v[cnt]);cur^=v[cnt];}if (type==3){int k=read();modify(x[k],v[k]),modify(y[k],v[k]);cur^=v[k];}if (type==4){int x,y;x=read(),y=read();puts(query(x,y)==cur? "YES":"NO");}}return 0;
}

【UOJ207】共价大爷游长沙【LCT】【异或】【随机化】相关推荐

  1. UOJ207 共价大爷游长沙

    考虑到路径是有向的,不是很好维护. 如果路径无向的话,可以直接转化为链加和查询操作. 既然有向的话,不妨考虑一波hash. 对于一组询问x,y,可以把树划分为两颗子树. 合法显然需要满足 x子树的起点 ...

  2. 【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息

    题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第 ...

  3. 【uoj207】 共价大爷游长沙

    http://uoj.ac/problem/207 (题目链接) 题意 给出一棵无根树,4种操作:在路径集合中加入一条路径,在路径集合中删除一条路径,删一条边加一条边,查询一条边是否被集合中所有路径经 ...

  4. [UOJ#207]共价大爷游长沙

    题目大意 一颗会动的树. 有一个点对集合会变. 每次询问一条树边,问集合内所有点对之间的路径是否都经过该边. 维护虚边信息的LCT 终于无聊来补了这题 每个点对随机一个10^9内的权值 然后给两端点的 ...

  5. ZJOI2019Round#1

    考的这么差二试基本不用去了 不想说什么了.就把这几天听课乱记的东西丢上来吧 这里是二试乱听课笔记ZJOI2019Round#2 ZJOI Round#1 Day1 M.<具体数学>选讲 罗 ...

  6. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  7. 跑出数字化升级“加速度”,腾讯云启产业基地“长沙模式”的探索

    文 | 曾响铃 来源 | 科技向令说(xiangling0815) 当互联网与产业加速融合,数字经济成为发展新引擎. 在长沙,2019年,深耕岩土工程自动化监测领域的湖南湘银河传感科技有限公司,借助湘 ...

  8. 画论38 董其昌《画禅室随笔》

    [中国历代画论目录] 目录 卷一 ◎论用笔 ◎评法书 ◎跋自书 ◎评古帖 卷二 ◎画诀 ◎画源 ◎题自画 ◎评旧画 卷三 ◎记事 ◎记游 ◎评诗 ◎评文 卷四 ◎杂言上 ◎杂言下 ◎楚中随笔 ◎禅悦 ...

  9. 书论66 董其昌《画禅室随笔》

    目录 卷一 论用笔 评法书 评古帖 卷二 画诀 画源 题自画 评旧画 论画 卷三 记事 记游 评诗 评文 卷四 杂言上 杂言下 楚中随笔 禅悦 卷一 论用笔 米海岳书,无垂不缩,无往不收.此八字真言, ...

最新文章

  1. IBM被曝拟出售昔日明星业务Watson Health,10年医疗梦就此破碎?
  2. 不愧是你!Python 之父退休太无聊,进微软搞开源!
  3. Scikit Learn: 在python中机器学习
  4. C语言经典例32-删除字符串中指定的字符
  5. 收藏:TerryLee的.NET设计模式系列文章
  6. Mybatis的selectKey使用
  7. linux下实现getch()函数的功能
  8. ausam3x 嵌入式linux,ATSAM3X8EA-AU - 微控制器, 32位, SAM3X系列, ARM 皮质-M3, 84nb
  9. mac terminal update management pack
  10. MySQL索引优化讲解
  11. Codeforces Round #360 (Div. 2) C. NP-Hard Problem 水题
  12. H3C模拟器simware搭建总结
  13. LoRa开发|LoRa模组AT指令开发
  14. 屏幕真伪测试软件,如何检测电视屏幕真伪4K、坏点漏光?两款工具一键识别!...
  15. 阿里云数据库掌门人褚霸:骑行与数据人生
  16. 拉格朗日/柯西中值定理与高考数学计算
  17. ret-sync插件:windbg/ollydbg+ida逆向调试神器
  18. python编程的线性/非线性规划问题求解
  19. TextClock 24小时制
  20. php 用户名长度,Discuz! X2修改注册用户名长度限制解决方案

热门文章

  1. java list 初始化_Java新特性:数据类型可以扔掉了?
  2. 这8个中国天文台你肯定不认识!
  3. 这就是你们有钱人炫富的新方式吗?
  4. 老师看完都吐血的五道题
  5. java中错误的源文件,关于Java源文件结构规则,说法错误的是()A.版权信息必须在java文件的开头B.package语句在imports...
  6. 鸿蒙思维和小央美,北市场附近艺术培训
  7. rockmq运维指令_RocketMQ 运维指令
  8. linux默认归档目录,Linux系统管理(第4章:目录和文件管理二)
  9. oracle crontab e,Linux运维知识之通过crontab -e编辑生成的定时任务,写在哪个文件中...
  10. 理请求时出现未知错误.服务器返回的状态码为: 500,react-native