[cogs2701]动态树
sol
比较裸啊。
注意操作顺序就行了。
code
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 200005;
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,q,fa[N],ls[N],rs[N],rev[N],sz[N],sum[N],Stack[N],top;
char s[1000];
bool isroot(int x){return ls[fa[x]]!=x&&rs[fa[x]]!=x;}
void pushup(int x){sum[x]=sum[ls[x]]+sum[rs[x]]+1+sz[x];}
void reverse(int x){swap(ls[x],rs[x]);rev[x]^=1;}
void pushdown(int x){if(!rev[x])return;if(ls[x])reverse(ls[x]);if(rs[x])reverse(rs[x]);rev[x]=0;}
void R_rotate(int x)
{
	int y=fa[x],z=fa[y];
	ls[y]=rs[x];
	if (rs[x]) fa[rs[x]]=y;
	fa[x]=z;
	if (y==ls[z]) ls[z]=x;if (y==rs[z]) rs[z]=x;
	rs[x]=y;fa[y]=x;
	pushup(y);
}
void L_rotate(int x)
{
	int y=fa[x],z=fa[y];
	rs[y]=ls[x];
	if (ls[x]) fa[ls[x]]=y;
	fa[x]=z;
	if (y==ls[z]) ls[z]=x;if (y==rs[z]) rs[z]=x;
	ls[x]=y;fa[y]=x;
	pushup(y);
}
void splay(int x)
{
	Stack[top=1]=x;
	for (int i=x;!isroot(i);i=fa[i])
		Stack[++top]=fa[i];
	while (top) pushdown(Stack[top--]);
	while (!isroot(x))
	{
		int y=fa[x],z=fa[y];
		if (isroot(y))
			if (x==ls[y]) R_rotate(x);
			else L_rotate(x);
		else
			if (y==ls[z])
				if (x==ls[y]) R_rotate(y),R_rotate(x);
				else L_rotate(x),R_rotate(x);
			else
				if (x==ls[y]) R_rotate(x),L_rotate(x);
				else L_rotate(y),L_rotate(x);
	}
	pushup(x);
}
void access(int x){for (int y=0;x;y=x,x=fa[x]) splay(x),sz[x]+=sum[rs[x]]-sum[y],rs[x]=y,pushup(x);}
void makeroot(int x){access(x);splay(x);reverse(x);}
int findroot(int x){access(x);splay(x);while (ls[x]) x=ls[x];return x;}
void link(int x,int y){makeroot(x);makeroot(y);fa[x]=y;sz[y]+=sum[x];pushup(y);}
int main()
{
	//freopen("dynamic_tree.in","r",stdin);
	//freopen("dynamic_tree.out","w",stdout);
	n=gi();q=gi();
	for (int i=1;i<=n;i++) sum[i]=1;
	while (q--)
	{
		int opt=gi(),u=gi();
		if (opt==1) makeroot(u);
		if (opt==2) access(u),printf("%d\n",sz[u]+1);
		if (opt==3) {int v=gi(),rt=findroot(u);link(u,v);makeroot(rt);}
	}
	return 0;
}
												
											[cogs2701]动态树的更多相关文章
- 如何利用FineReport制作动态树报表
		
在对数据字段进行分类管理时,利用动态树折叠数据是一个很好的方法,也就是点击数据前面的加号才展开对应下面的数据,如下图.那这样的效果在制作报表时该如何实现呢? 下面以报表工具FineReport为例介绍 ...
 - 动态树之LCT(link-cut tree)讲解
		
动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作.其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT( ...
 - 【BZOJ-3589】动态树      树链剖分 + 线段树 + 线段覆盖(特殊的技巧)
		
3589: 动态树 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 405 Solved: 137[Submit][Status][Discuss] ...
 - BZOJ-2049    Cave洞穴勘测      动态树Link-Cut-Tree (并查集骗分TAT)
		
2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5833 Solved: 2666 [Submit] ...
 - 学习笔记-动态树Link-Cut-Tree
		
--少年你有梦想吗? --少年你听说过安利吗? 安利一个集训队讲解:http://wenku.baidu.com/view/75906f160b4e767f5acfcedb 关于动态树问题,有多种方法 ...
 - BZOJ 3589  动态树(子树操作,链查询)
		
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3589 题意:给出一棵有根树,两种操作:(1)以u为根的子树所有节点权值加上一个数字 ...
 - Tsinsen A1517. 动态树  树链剖分,线段树,子树操作
		
题目 : http://www.tsinsen.com/A1517 A1517. 动态树 时间限制:3.0s 内存限制:1.0GB 总提交次数:227 AC次数:67 平均分:49. ...
 - 动态树 Link-Cut Trees
		
动态树 动态树问题, 即要求我们维护一个由若干棵子结点无序的有根树组成的森林. 要求这个数据结构支持对树的分割.合并,对某个点到它的根的路径的某些操作,以及对某个点的子树进行的某些操作. 在这里我们考 ...
 - bzoj 2594: [Wc2006]水管局长数据加强版 动态树
		
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 934 Solved: 291[Submit][Sta ...
 
随机推荐
- ajax常用操作
			
load的方法的使用(现在已不常用) <!doctype html><html lang="en"><head> <meta charse ...
 - 02-Nginx+MySQL+PHP7
			
[安装Nginx] #先安装如下包 yum install gcc gcc-c++ kernel-devel yum -y install pcre-devel openssl openssl-dev ...
 - 用tig来查看git log
			
sudo apt-get install tig安装软件 在项目目录下:tig查看git 的 log 常用指令:上下箭头选择log的版本enter进入具体版本查看详细k和j是上下滚动查看详细信息的内容 ...
 - [ZJOI2008]骑士
			
[ZJOI2008]骑士 标签: DP 题目链接 题解 把边看成无向的. 其实就是求这个东西的最大独立集. 但是这不是树,怎么求呢? 其实还是一样的求法. 对于每一个连通块.最多有这个联通块的大小数目 ...
 - linux 下yum使用技巧
			
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 经常会遇上一些linux系统允许你上外网,而一些是不允许的,这时我们 ...
 - 让互联网更快:新一代QUIC协议在腾讯的技术实践分享
			
本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况下就能提升 15% 以上的访问速度,特别是弱网络的时候能够提升 20% 以上的访问速度. 如 ...
 - ch7复用类
			
导出类的初始化是从基类开始向下扩展的,先初始化基类,再初始化由基类继承而来的类. 若类B需要类A中的一些甚至全部方法,但类B实际上不是并不是真正的类A,则可以通过代理的方式在B中实现所需要的A的方法, ...
 - Centos下安装Lamp和vsftpd、redis
			
yum安装httpd和php.mysql服务 yum search httpd //搜索httpd开头的软件包 yum install httpd.x86_64 //找到apache 对应的软件包名 ...
 - Java数字签名——DSA算法
			
RSA数字加密算法参考:http://www.cnblogs.com/LexMoon/p/javaRSA.html DSS: 数字签名标准 DSA: 数字签名算法 DSA仅仅包含数字签名 —————— ...
 - 转 Caffe学习系列(2):数据层及参数
			
http://www.cnblogs.com/denny402/p/5070928.html 要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等, 而一个模型由多个 ...