Query on a tree again! SPOJ - QTREE3
https://vjudge.net/problem/SPOJ-QTREE3
https://www.luogu.org/problemnew/show/P4116
一个log(LCT)比两个log(树剖)慢到不知道哪里去系列。。。
 #pragma GCC optimize("Ofast")
 #include<cstdio>
 #include<algorithm>
 #include<cstring>
 #include<vector>
 using namespace std;
 #define fi first
 #define se second
 #define mp make_pair
 #define pb push_back
 typedef long long ll;
 typedef unsigned long long ull;
 typedef pair<int,int> pi;
 namespace LCT
 {
 struct Node
 {
     Node *ch[],*fa;
     bool rev;
     bool d;Node *dd;
     int id;
     void upd()
     {
         if(ch[]&&ch[]->dd)    dd=ch[]->dd;
         else if(d)    dd=this;
         else dd=ch[]?ch[]->dd:;
     }
     void pd()
     {
         if(rev)
         {
             swap(ch[],ch[]);
             if(ch[])    ch[]->rev^=;
             if(ch[])    ch[]->rev^=;
             rev=;
         }
     }
 }nodes[];
 int mem;
 Node *getnode()
 {
     return nodes+(mem++);
 }
 bool isroot(Node *x)
 {
     return (!x->fa)||((x->fa->ch[]!=x)&&(x->fa->ch[]!=x));
 }
 bool gson(Node *o)    {return o==o->fa->ch[];}
 void rotate(Node *o,bool d)
 {
     Node *k=o->ch[!d];if(!isroot(o))    o->fa->ch[gson(o)]=k;
     o->ch[!d]=k->ch[d];k->ch[d]=o;
     o->upd();k->upd();
     k->fa=o->fa;o->fa=k;if(o->ch[!d])    o->ch[!d]->fa=o;
 }
 Node *st[];int top;
 void solvetag(Node *o)
 {
     while(!isroot(o))    st[++top]=o,o=o->fa;
     st[++top]=o;
     while(top)    st[top--]->pd();
 }
 void splay(Node *o)
 {
     solvetag(o);
     Node *fa,*fafa;bool d1,d2;
     while(!isroot(o))
     {
         fa=o->fa;d1=(o==fa->ch[]);
         if(isroot(fa))    rotate(fa,d1);
         else
         {
             fafa=o->fa->fa;d2=(fa==fafa->ch[]);//要保证fa不是root之后才能获取这两个值,曾错过
             if(d1==d2)    rotate(fafa,d1),rotate(fa,d1);//zig-zig,两次相同方向的单旋,先把父亲转上去,再把自己转上去
             else    rotate(fa,d1),rotate(fafa,d2);//zig-zag,两次相反方向的单旋,连续两次把自己转上去
         }
     }
 }
 void access(Node *o)
 {
     for(Node *lst=NULL;o;lst=o,o=o->fa)
     {
         splay(o);//此处不pushdown是由于splay中保证进行过了
         o->ch[]=lst;o->upd();//注意upd
     }
 }
 Node *gtop(Node *o)
 {
     access(o);splay(o);
     for(;o->ch[];o=o->ch[],o->pd());//此处不在开始前pushdown(o)是由于splay中保证进行过了
     splay(o);return o;//听说这里不splay一下也很难卡掉
 }
 void mtop(Node *o)    {access(o);splay(o);o->rev^=;}
 void link(Node *x,Node *y)
 {
     if(gtop(x)==gtop(y))    return;
     mtop(y);y->fa=x;
 }
 void cut(Node *x,Node *y)
 {
     mtop(x);access(y);splay(y);
     if(y->ch[]!=x||x->ch[])    return;//如果x、y之间直接有边,那么上面一行的操作之后应当是x与y在单独一棵splay中,那么一定保证y左子节点是x且x没有右子节点
     x->fa=y->ch[]=NULL;//注意,改的是x的父亲和y的子节点(虽然x的确是树的根,但是此时在splay上是y的子节点,不能搞混)
     y->upd();//注意
 }
 void change(Node *y)
 {
     access(y);splay(y);
     y->d^=;y->upd();
 }
 int query(Node *x,Node *y)
 {
     mtop(x);access(y);splay(y);
     return y->dd?y->dd->id:-;
 }
 }
 LCT::Node *nd[];
 int n,q;
 int main()
 {
     int i,idx,x,a,b;
     scanf("%d%d",&n,&q);
     for(i=;i<=n;i++)    nd[i]=LCT::getnode(),nd[i]->id=i;
     for(i=;i<n;i++)
     {
         scanf("%d%d",&a,&b);
         LCT::link(nd[a],nd[b]);
     }
     while(q--)
     {
         scanf("%d%d",&idx,&x);
         if(idx==)    LCT::change(nd[x]);
         else    printf("%d\n",LCT::query(nd[],nd[x]));
     }
     return ;
 }
Query on a tree again! SPOJ - QTREE3的更多相关文章
- Query on a tree IV SPOJ - QTREE4
		https://vjudge.net/problem/SPOJ-QTREE4 点分就没有一道不卡常的? 卡常记录: 1.把multiset换成手写的带删除堆(套用pq)(作用很大) 2.把带删除堆里面 ... 
- QTREE3  spoj 2798. Query on a tree again! 树链剖分+线段树
		Query on a tree again! 给出一棵树,树节点的颜色初始时为白色,有两种操作: 0.把节点x的颜色置反(黑变白,白变黑). 1.询问节点1到节点x的路径上第一个黑色节点的编号. 分析 ... 
- SPOJ 375. Query on a tree (树链剖分)
		Query on a tree Time Limit: 5000ms Memory Limit: 262144KB This problem will be judged on SPOJ. Ori ... 
- SPOJ QTREE Query on a tree  树链剖分+线段树
		题目链接:http://www.spoj.com/problems/QTREE/en/ QTREE - Query on a tree #tree You are given a tree (an a ... 
- spoj 375 Query on a tree(树链剖分,线段树)
		Query on a tree Time Limit: 851MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Sub ... 
- 动态树(Link Cut Tree) :SPOJ 375 Query on a tree
		QTREE - Query on a tree #number-theory You are given a tree (an acyclic undirected connected graph) ... 
- SPOJ 375. Query on a tree (动态树)
		375. Query on a tree Problem code: QTREE You are given a tree (an acyclic undirected connected graph ... 
- SPOJ PT07J - Query on a tree III(划分树)
		PT07J - Query on a tree III #tree You are given a node-labeled rooted tree with n nodes. Define the ... 
- spoj 913 Query on a tree II (倍增lca)
		Query on a tree II You are given a tree (an undirected acyclic connected graph) with N nodes, and ed ... 
随机推荐
- I want a mysqldump –ignore-database option
			$ time mysqldump --databases `mysql --skip-column-names -e "SELECT GROUP_CONCAT(schema_name SEP ... 
- 利用PHP判断iPhone、iPad、Android、PC设备
			首页那张大图确实是一个比较头疼的问题 在PC上显示是没问题的,可是到手机上就会超出页面一大截,如果做自适应,图片会被强制压缩 无奈只能用wp_is_mobile()函数在手机上隐藏了这张图,可是这函数 ... 
- 【bzoj3210】花神的浇花集会
			将(x,y)转化成(x+y,x-y)可以将切比雪夫距离转化成曼哈顿距离(自己推一推) A.B的切比雪夫距离就是A‘.B‘曼哈顿距离的一半. 那么可以将x.y分离处理,排序中位数即可. 注意如果最后选的 ... 
- 启用了不安全的HTTP方法解决办法  IBM APPSCAN
			启用了不安全的HTTP方法解决办法 IBM APPSCAN 安全风险: 可能会在Web 服务器上上载.修改或删除Web 页面.脚本和文件. 可能原因: Web 服务器 ... 
- 0 lrwxrwxrwx.  1 root     root       13 Nov 20 12:44 scala -> scala-2.12.4
			符号链接的文件属性相同,真正的权限属性由符号链接所指向的实际文件决定. 
- Does Hadoop require SSH?
			https://wiki.apache.org/hadoop/FAQ#Does_Hadoop_require_SSH.3F Hadoop provided scripts (e.g., start-m ... 
- HDOJ 5045 Contest
			状压DP.. . . Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ... 
- extjs4.0 treepanel节点的选中、展开! 数据的重新加载
			1.extjs4.0API较3.0有非常大变化2.多级子父节点的选中和展开.3.数据的重新加载.tree.getStore().load4.节点的移除,从树中根据ID获取节点 tree.getStor ... 
- bzoj3957: [WF2011]To Add or to Multiply
			gay队牛逼! 我们可以强行拆一下柿子,最终得到的值会是m^k*x+m^k*u(k)*a+m^k-1*u(k-1)*a……m^0*u(0)*a 其中u表示后面有i个m的a有多少个 答案就是k+∑u 枚 ... 
- Oracle :多实例切换
			Connecting to 10.1.4.21:22...Connection established.To escape to local shell, press 'Ctrl+Alt+]'. La ... 
