日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Link-Cut Tree指针模板

發(fā)布時(shí)間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Link-Cut Tree指针模板 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

模板:

  以下為彈飛綿羊代碼:

1 #define Troy 2 3 #include "bits/stdc++.h" 4 5 using namespace std; 6 7 const int N=2e5+5; 8 9 inline int read(){ 10 int s=0,k=1;char ch=getchar(); 11 while(ch<'0'|ch>'9') ch=='-'?k=-1:0,ch=getchar(); 12 while(ch>47&ch<='9') s=s*10+(ch^48),ch=getchar(); 13 return s*k; 14 } 15 16 #define size(t) (t?t->size:0) 17 #define rev(t) (t?t->rev^=1:0) 18 19 struct Node{ 20 int size,rev; 21 Node *fa,*son[2]; 22 Node(){fa=son[0]=son[1]=NULL;size=1,rev=0;} 23 inline void update(){ 24 size=1+size(son[0])+size(son[1]); 25 } 26 inline void pushdown(){ 27 if(!rev) return; 28 rev=0,swap(son[0],son[1]); 29 rev(son[0]),rev(son[1]); 30 } 31 }*pool[N],*tmp[N],tree[N];int top; 32 33 inline void init_pool(){for(;top<N;++top) pool[top]=tree+top;} 34 35 inline void newNode(Node *&p,Node *f){p=pool[--top];*p=Node();p->fa=f;} 36 inline void freeNode(Node *&p){pool[top++]=p,p=NULL;} 37 38 int to[N],n; 39 class LinkCutTree{ 40 public: 41 Node *node[N]; 42 inline void init(int n){for(register int i=1;i<=n;++i)newNode(node[i],NULL);} 43 44 #define son(p) (p->fa->son[1]==p) 45 #define is_root(p) ((!p->fa)||(p->fa->son[0]!=p&&p->fa->son[1]!=p)) 46 47 inline void rotate(Node *p){ 48 int a=son(p)^1;Node *f=p->fa; 49 f->son[a^1]=p->son[a]; 50 if(p->son[a]) p->son[a]->fa=f; 51 p->fa=f->fa; 52 if(!is_root(f)) p->fa->son[son(f)]=p; 53 f->fa=p,p->son[a]=f,f->update(),p->update(); 54 } 55 56 inline void splay(Node *p){ 57 register int pos=0; 58 for(Node *t=p;;t=t->fa){ 59 tmp[++pos]=t; 60 if(is_root(t)) break; 61 } 62 for(;pos;--pos) tmp[pos]->pushdown(); 63 for(;!is_root(p);rotate(p)) 64 if(!is_root(p->fa)) rotate(son(p)==son(p->fa)?p->fa:p); 65 } 66 67 inline void access(Node *p){ 68 for(Node *pre=NULL;p;pre=p,p=p->fa) 69 splay(p),p->son[1]=pre,p->update(); 70 } 71 72 inline void make_root(Node *p){ 73 access(p),splay(p),rev(p); 74 } 75 76 inline void cut(Node *x,Node *y){ 77 make_root(x),access(y),splay(y); 78 x->fa=y->son[0]=NULL;y->update(); 79 } 80 81 inline void link(Node *x,Node *y){make_root(x);x->fa=y;} 82 inline void link(int x,int y){node[x]->fa=node[y];} 83 84 inline void op1(int x){ 85 make_root(node[n+1]),access(node[x]),splay(node[x]); 86 printf("%d\n",node[x]->size-1); 87 } 88 89 inline void op2(int x,int y){ 90 cut(node[x],node[min(n+1,x+to[x])]); 91 link(node[x],node[min(n+1,y+x)]);to[x]=y; 92 } 93 }lct; 94 95 int main(){ 96 n=read(); 97 init_pool(); 98 lct.init(n+1); 99 register int i; 100 for(i=1;i<=n;++i){ 101 to[i]=read(); 102 lct.link(i,min(i+to[i],n+1)); 103 } 104 int q=read(),x,y; 105 while(q--){ 106 if(read()==1) 107 lct.op1(read()+1); 108 else{ 109 x=read(),y=read(); 110 lct.op2(x+1,y); 111 } 112 }return 0; 113 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Troywar/p/8042524.html

總結(jié)

以上是生活随笔為你收集整理的Link-Cut Tree指针模板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。