【BZOJ】【3282】Tree

LCT

  喜闻乐见的Link-Cut-Tree……

  srO zyf

  http://www.cnblogs.com/zyfzyf/p/4149109.html

  目测我是第222个?………………不要在意这些细节……

  

  和以前写的splay还是有些区别呢……

  比如splay中Push_down的写法……还有rotate的新姿势~

  算法看看论文什么的……很好懂

  1 /**************************************************************
  2     Problem: 3282
  3     User: Tunix
  4     Language: C++
  5     Result: Accepted
  6     Time:2596 ms
  7     Memory:8596 kb
  8 ****************************************************************/
  9
 10 //BZOJ 3282
 11 #include<cstdio>
 12 #include<vector>
 13 #include<cstring>
 14 #include<cstdlib>
 15 #include<iostream>
 16 #include<algorithm>
 17 #define rep(i,n) for(int i=0;i<n;++i)
 18 #define F(i,j,n) for(int i=j;i<=n;++i)
 19 #define D(i,j,n) for(int i=j;i>=n;--i)
 20 #define pb push_back
 21 using namespace std;
 22 const int N=300010;
 23 #define debug
 24
 25 int c[N][2],fa[N],v[N],s[N],st[N],top=0;
 26 bool rev[N];
 27 int n,m;
 28
 29 void Push_up(int x){
 30     int l=c[x][0],r=c[x][1];
 31     s[x]=s[l]^s[r]^v[x];
 32 }
 33 void Push_down(int x){
 34     int l=c[x][0],r=c[x][1];
 35     if(rev[x]){
 36         rev[x]^=1; rev[l]^=1; rev[r]^=1;
 37         swap(c[x][0],c[x][1]);
 38     }
 39 }
 40 bool isroot(int x){
 41     return c[fa[x]][0]!=x && c[fa[x]][1]!=x;
 42 }
 43 void rotate(int x){
 44     int y=fa[x],z=fa[y],l=c[y][1]==x,r=l^1;
 45     if (!isroot(y)) c[z][c[z][1]==y]=x;
 46     fa[x]=z; fa[y]=x; fa[c[x][r]]=y;
 47     c[y][l]=c[x][r]; c[x][r]=y;
 48     Push_up(y); Push_up(x);
 49 }
 50 void splay(int x){
 51     top=0; st[top++]=x;
 52     for(int i=x;!isroot(i);i=fa[i])
 53         st[top++]=fa[i];
 54     while(top--) Push_down(st[top]);
 55
 56     while(!isroot(x)){
 57         int y=fa[x],z=fa[y];
 58         if (!isroot(y)){
 59             if (c[y][0]==x^c[z][0]==y) rotate(x);
 60             else rotate(y);
 61         }
 62         rotate(x);
 63     }
 64 }
 65 void access(int x){
 66     for(int t=0;x;t=x,x=fa[x])
 67         splay(x),c[x][1]=t,Push_up(x);
 68 }
 69 void makeroot(int x){
 70     access(x); splay(x); rev[x]^=1;
 71 }
 72 int find(int x){
 73     access(x); splay(x);
 74     while(c[x][0]) x=c[x][0];
 75     return x;
 76 }
 77 void cut(int x,int y){
 78     makeroot(x); access(y); splay(y);
 79     if (c[y][0]==x) c[y][0]=fa[x]=0;
 80 }
 81 void link(int x,int y){
 82     makeroot(x); fa[x]=y;
 83 }
 84 //LCT end
 85 int main(){
 86     #ifndef ONLINE_JUDGE
 87     freopen("file.in","r",stdin);
 88 //  freopen("file.out","w",stdout);
 89     #endif
 90     scanf("%d%d",&n,&m);
 91     F(i,1,n) {scanf("%d",&v[i]); s[i]=v[i];}
 92
 93     int c,x,y;
 94     F(i,1,m){
 95         scanf("%d%d%d",&c,&x,&y);
 96         switch(c){
 97             case 0:makeroot(x); access(y); splay(y); printf("%d\n",s[y]);break;
 98             case 1:if (find(x)!=find(y)) link(x,y);break;
 99             case 2:if (find(x)==find(y)) cut(x,y);break;
100             case 3:access(x); splay(x); v[x]=y; Push_up(x);break;
101         }
102     }
103     return 0;
104 }

时间: 2024-10-10 14:13:21

【BZOJ】【3282】Tree的相关文章

P2433 - 【BZOJ 3262三维偏序】陌上花开------三维偏序

P2433 - [BZOJ 3262三维偏序]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,

【BZOJ做题记录】07.07~?

在NOI一周前重开一个坑 最后更新时间:7.07 11:26 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后面的部分就好了 BZOJ1258: [CQOI2007]三角形tri:在草稿纸上按照位置和边找一下规律就好了 BZOJ1260: [CQOI2007]涂色paint:简单的区间DP BZOJ1303: [CQOI2009]中位数图:小于中位数的改为-1大于的改为1,算一算前缀和然后哈希一下乘一乘就好

【BZOJ】2631: tree LCT

[题意]给定n个点的树,每个点初始权值为1,m次操作:1.x到y的点加值,2.断一条边并连一条边,保证仍是树,3.x到y的点乘值,4.x到y的点权值和取模.n,m<=10^5. [算法]Link-Cut Tree [题解]区间加和区间乘标记的处理:[BZOJ]1798: [Ahoi2009]Seq 维护序列seq 线段树 splay上维护要注意: 1.上传时加本身. 2.改值的时候不能影响到0点. 3.所有改变点的儿子的地方都要上传,所有改变点的父亲的地方都要下传. 除了rotate,还有acc

【BZOJ】2002: [Hnoi2010]Bounce 弹飞绵羊(lct)

(BZOJ挂了,还没在BZOJ测,先是在wikioi测过了,,) 囧.在军训时立志要学lct!!!这是一道lct的裸题,只有access操作(10行都没有啊亲...缩行大法的话,我就不说了..)(link操作相当于水过),其实lct很简单..想想都有点小激动...... lct用splay维护的话,一下就写好了..但是我在写lct的时候,发现了一些我原来splay的老问题,我原来也知道了的,就是将null的ch给赋值了,因为在rot操作里没有特判,所以导致了null的孩子被赋值了,导致我的lct

【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】

[107-Binary Tree Level Order Traversal II(二叉树层序遍历II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example

【BZOJ 2820】 YY的GCD

2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 807  Solved: 404 [Submit][Status] Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教-- 多组输入 Input 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示

【BZOJ】3319: 黑白树

http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种:1.查询u到根的第一条黑边的编号.2.将u到v的路径全部染成黑色 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream>

【bzoj】4538: [Hnoi2016]网络

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4538 维护一个数据结构支持对于一颗树的操作,需要支持: 1.对于树上的一条路径上的每个点上放一个值. 2.撤销某次操作的路劲放. 3.查询除了经过这个点的路径的最大值. 往一个路径上丢值相当于往不经过条路径的所有点上丢值. 用一个树链剖分即可维护,对于操作区间取反. 直接查询单点最大值即可. 为了维护单点最大值,线段树中的每一个点对应两个堆,用于维护插入誉删除. 防止爆空间,所以标记永久

【BZOJ】【1089】【SCOI2003】严格n元树

高精度/递推 Orz Hzwer…… 然而我想多了…… 理解以后感觉黄学长的递推好精妙啊 顺便学到了一份高精度的板子= =233 引用下题解: f[i]=f[i-1]^n+1 ans=f[d]-f[d-1] 然后加个高精度... 话说这个数据范围是虚的吧... 极限数据根本不会做.. 1 /************************************************************** 2 Problem: 1089 3 User: Tunix 4 Language:

【BZOJ】【1050】【HAOI2006】旅行comf

枚举/暴力/Kruskal orz……我sb了……其实是sb题<_< 有一道题问的是最小极差生成树……(不记得是什么名字了,就是求最大边权与最小边权差最小的生成树)做法是枚举最小边,然后kruskal找最大边 这题同理,因为$m\leq 5000$,所以$m^2$的算法即可…… 1 /************************************************************** 2 Problem: 1050 3 User: Tunix 4 Language: C