[UOJ207]共价大爷游长沙
sol
这题真是太神啦!
对于S集合中的每个点对,给他们随机附上一个相同权值。
两个点在边(x,y)的两侧当且仅当一个点在x的子树中,另一个点不在x的子树中(假设x是y的儿子)
维护一下子树点权异或和,若x子树的异或和等于所有点对权值的异或和就说明(x,y)是一条必经边
splay终于使用正常方法写 祭
这种算法是可以卡的吧...
code
#include<cstdio>
#include<algorithm>
#include<ctime>
using namespace std;
const int N = 100005;
int gi()
{
	int x=0,w=1;char ch=getchar();
	while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if (ch=='-') w=0,ch=getchar();
	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return w?x:-x;
}
int n,m,fa[N],ch[2][N],rev[N],val[N],sz[N],sum[N],Stack[N],top,tot,all;
bool son(int x){return ch[1][fa[x]]==x;}
bool isroot(int x){return ch[0][fa[x]]!=x&&ch[1][fa[x]]!=x;}
void pushup(int x){sum[x]=sum[ch[0][x]]^sum[ch[1][x]]^sz[x]^val[x];}
void reverse(int x){if(!x)return;swap(ch[0][x],ch[1][x]);rev[x]^=1;}
void pushdown(int x){if(!rev[x])return;reverse(ch[0][x]);reverse(ch[1][x]);rev[x]=0;}
void rotate(int x)
{
	int y=fa[x],z=fa[y],c=son(x);
	ch[c][y]=ch[c^1][x];if (ch[c][y]) fa[ch[c][y]]=y;
	fa[x]=z;if (!isroot(y)) ch[son(y)][z]=x;
	ch[c^1][x]=y;fa[y]=x;pushup(y);
}
void splay(int x)
{
	Stack[top=1]=x;
	for (int y=x;!isroot(y);y=fa[y]) Stack[++top]=fa[y];
	while (top) pushdown(Stack[top--]);
	for (int y=fa[x];!isroot(x);rotate(x),y=fa[x])
		if (!isroot(y)) son(x)^son(y)?rotate(x):rotate(y);
	pushup(x);
}
void access(int x)
{
	for (int y=0;x;y=x,x=fa[x])
	{
		splay(x);
		sz[x]^=sum[y]^sum[ch[1][x]];
		ch[1][x]=y;
		pushup(x);
	}
}
void makeroot(int x){access(x);splay(x);reverse(x);}
void split(int x,int y){makeroot(x);access(y);splay(y);}
void link(int x,int y){makeroot(x);makeroot(y);fa[x]=y;sz[y]^=sum[x];pushup(y);}
void cut(int x,int y){split(x,y);ch[0][y]=fa[x]=0;}
void modify(int u,int v){makeroot(u);val[u]^=v;pushup(u);}
struct node{int x,y,v;}S[N<<2];
int main()
{
	srand(141905&141936);
	gi();n=gi();m=gi();
	for (int i=1,u,v;i<n;i++)
		u=gi(),v=gi(),link(u,v);
	while (m--)
	{
		int opt=gi();
		if (opt==1)
		{
			int x=gi(),y=gi(),u=gi(),v=gi();
			cut(x,y);link(u,v);
		}
		if (opt==2)
		{
			int x=gi(),y=gi(),v=rand()%(1<<30);
			S[++tot]=(node){x,y,v};all^=v;
			modify(x,v);modify(y,v);
		}
		if (opt==3)
		{
			int x=gi();all^=S[x].v;
			modify(S[x].x,S[x].v);modify(S[x].y,S[x].v);
		}
		if (opt==4)
		{
			int x=gi(),y=gi();
			split(x,y);puts(sum[x]==all?"YES":"NO");
		}
	}
	return 0;
}
												
											[UOJ207]共价大爷游长沙的更多相关文章
- uoj207共价大爷游长沙
		
话说我可能还没有调出魔法森林呢...说好的lct第一题呢... 又是一个随机化的方法,毕竟又是判定性的问题 上次是判断无向图联通 这次是判断一些路径是否经过一条定边 若把路径上的边全部异或上一个路径的 ...
 - 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\) 条边的无向图,点编 ...
 
随机推荐
- 音乐之声——midi制作原理
			
实际发出声音需要4项必备的条件 1 发生的装置 Sequencer 把sequencer想成CD播放机 (plays) 2 要演奏的乐曲 Sequence sequence就好像是单曲 ...
 - go get报错unrecognized import path “golang.org/x/net/context”…
			
今天安装gin框架,首先下载gin,命令如下:go get github.com/mattn/go-sqlite3 结果报错: package golang.org/x/net/context: un ...
 - ElasticSearch Kibana 和Logstash 安装x-pack记录
			
前言 最近用到了ELK的集群,想想还是用使用官方的x-pack的monitor功能对其进行监控,这里先上图看看: 环境如下: 操作系统: window 2012 R2 ELK : elasticsea ...
 - [bzoj2286][Sdoi 2011]消耗战
			
[bzoj2286]消耗战 标签: 虚树 DP 题目链接 题解 很容易找出\(O(mn)\)的做法. 只需要每次都dp一遍. 但是m和n是同阶的,所以这样肯定会T的. 注意到dp的时候有很多节点是不需 ...
 - angular4升级angular5问题记录之this.location.back()
			
在之前的项目中,导航回上一个路由采用注入的Location服务,利用浏览器的历史堆栈,导航到上一步. 官方文档也就是这么写的 而然在升级到5.2的版本的时候,在浏览器运行的时候并没有什么问题,在项目打 ...
 - Jenkins系列——定时构建
			
1.环境说明 操作系统:win7旗舰版64bit jdk:sun JDK1.7.0_80 64bit tomcat:apache-tomcat-8.0.41 jenkins:2.32.3LST 本系列 ...
 - UVA - 11270 轮廓线DP
			
其实这题还能用状压DP解决,可是时间达到2000ms只能过掉POJ2411.状压DP解法详见状压DP解POJ2411 贴上POJ2411AC代码 : 2000ms 时间复杂度h*w*(2^w)*(2^ ...
 - git 命令和使用场景总结
			
资料地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 http://w ...
 - Oracle总结【视图、索引、事务、用户权限、批量操作】
			
前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了...那么本篇主要总结关于Oralce视图.序列.事务的一些内容... 在数据库中,我们可以把各种的SQL语句分为四大类 ...
 - 实战DeviceIoControl 之二:获取软盘/硬盘/光盘的参数
			
Q 在MSDN的那个demo中,将设备名换成"A:"取A盘参数,先用资源管理器读一下盘,再运行这个程序可以成功,但换一张盘后就失败:换成"CDROM0"取CDR ...