【UOJ207】共价大爷游长沙【LCT】【异或】【随机化】
传送门
题意:维护一棵无权树和一个路径集合SSS,支持以下操作:
- 断边连边
- 在SSS加入中加入一条路径
- 删除SSS中的一条路径
- 询问是否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(nlogn)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】【异或】【随机化】相关推荐
- UOJ207 共价大爷游长沙
考虑到路径是有向的,不是很好维护. 如果路径无向的话,可以直接转化为链加和查询操作. 既然有向的话,不妨考虑一波hash. 对于一组询问x,y,可以把树划分为两颗子树. 合法显然需要满足 x子树的起点 ...
- 【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息
题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第 ...
- 【uoj207】 共价大爷游长沙
http://uoj.ac/problem/207 (题目链接) 题意 给出一棵无根树,4种操作:在路径集合中加入一条路径,在路径集合中删除一条路径,删一条边加一条边,查询一条边是否被集合中所有路径经 ...
- [UOJ#207]共价大爷游长沙
题目大意 一颗会动的树. 有一个点对集合会变. 每次询问一条树边,问集合内所有点对之间的路径是否都经过该边. 维护虚边信息的LCT 终于无聊来补了这题 每个点对随机一个10^9内的权值 然后给两端点的 ...
- ZJOI2019Round#1
考的这么差二试基本不用去了 不想说什么了.就把这几天听课乱记的东西丢上来吧 这里是二试乱听课笔记ZJOI2019Round#2 ZJOI Round#1 Day1 M.<具体数学>选讲 罗 ...
- 一句话题解(20170801~20170125)
8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...
- 跑出数字化升级“加速度”,腾讯云启产业基地“长沙模式”的探索
文 | 曾响铃 来源 | 科技向令说(xiangling0815) 当互联网与产业加速融合,数字经济成为发展新引擎. 在长沙,2019年,深耕岩土工程自动化监测领域的湖南湘银河传感科技有限公司,借助湘 ...
- 画论38 董其昌《画禅室随笔》
[中国历代画论目录] 目录 卷一 ◎论用笔 ◎评法书 ◎跋自书 ◎评古帖 卷二 ◎画诀 ◎画源 ◎题自画 ◎评旧画 卷三 ◎记事 ◎记游 ◎评诗 ◎评文 卷四 ◎杂言上 ◎杂言下 ◎楚中随笔 ◎禅悦 ...
- 书论66 董其昌《画禅室随笔》
目录 卷一 论用笔 评法书 评古帖 卷二 画诀 画源 题自画 评旧画 论画 卷三 记事 记游 评诗 评文 卷四 杂言上 杂言下 楚中随笔 禅悦 卷一 论用笔 米海岳书,无垂不缩,无往不收.此八字真言, ...
最新文章
- IBM被曝拟出售昔日明星业务Watson Health,10年医疗梦就此破碎?
- 不愧是你!Python 之父退休太无聊,进微软搞开源!
- Scikit Learn: 在python中机器学习
- C语言经典例32-删除字符串中指定的字符
- 收藏:TerryLee的.NET设计模式系列文章
- Mybatis的selectKey使用
- linux下实现getch()函数的功能
- ausam3x 嵌入式linux,ATSAM3X8EA-AU - 微控制器, 32位, SAM3X系列, ARM 皮质-M3, 84nb
- mac terminal update management pack
- MySQL索引优化讲解
- Codeforces Round #360 (Div. 2) C. NP-Hard Problem 水题
- H3C模拟器simware搭建总结
- LoRa开发|LoRa模组AT指令开发
- 屏幕真伪测试软件,如何检测电视屏幕真伪4K、坏点漏光?两款工具一键识别!...
- 阿里云数据库掌门人褚霸:骑行与数据人生
- 拉格朗日/柯西中值定理与高考数学计算
- ret-sync插件:windbg/ollydbg+ida逆向调试神器
- python编程的线性/非线性规划问题求解
- TextClock 24小时制
- php 用户名长度,Discuz! X2修改注册用户名长度限制解决方案
热门文章
- java list 初始化_Java新特性:数据类型可以扔掉了?
- 这8个中国天文台你肯定不认识!
- 这就是你们有钱人炫富的新方式吗?
- 老师看完都吐血的五道题
- java中错误的源文件,关于Java源文件结构规则,说法错误的是()A.版权信息必须在java文件的开头B.package语句在imports...
- 鸿蒙思维和小央美,北市场附近艺术培训
- rockmq运维指令_RocketMQ 运维指令
- linux默认归档目录,Linux系统管理(第4章:目录和文件管理二)
- oracle crontab e,Linux运维知识之通过crontab -e编辑生成的定时任务,写在哪个文件中...
- 理请求时出现未知错误.服务器返回的状态码为: 500,react-native