【高级数据结构】[SPOJ QTREE]树链剖分/动态树各一模板
生活随笔
收集整理的這篇文章主要介紹了
【高级数据结构】[SPOJ QTREE]树链剖分/动态树各一模板
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:
樹(shù)鏈剖分:
動(dòng)態(tài)樹(shù)(LCT):
#include<cstdio> #include<algorithm> #include<cstring> #define MAXN 10000 using namespace std; int n,e2id[MAXN+10],T; void Read(int &x){char c;while(c=getchar(),c!=EOF)if(c>='0'&&c<='9'){x=c-'0';while(c=getchar(),c>='0'&&c<='9')x=x*10+c-'0';ungetc(c,stdin);return;} } struct node{int val,mx,wt;node *ch[2],*fa;bool pre; }splay_tree[MAXN+10]; struct nodedge{int v,wt,pos;nodedge *next; }edge[MAXN*2+10],*ecnt=edge,*adj[MAXN+10]; inline void addedge(int u,int v,int wt,int pos){nodedge *p=++ecnt;p->v=v;p->wt=wt;p->next=adj[u];p->pos=pos;adj[u]=p; } inline void init(node *p){p->ch[0]=p->ch[1]=0;p->pre=0; } void dfs(int u,int dep,int fa){node *x=&splay_tree[u],*y;init(x);x->val=dep;for(nodedge *p=adj[u];p;p=p->next){if(p->v!=fa){e2id[p->pos]=p->v;y=&splay_tree[p->v];y->mx=y->wt=p->wt;y->fa=x;dfs(p->v,dep+1,u);}} } void read(){Read(n);int u,v,wt,i;for(i=1;i<n;i++){Read(u),Read(v),Read(wt);addedge(u,v,wt,i);addedge(v,u,wt,i);}init(&splay_tree[1]);splay_tree[1].fa=0;dfs(1,1,0); } inline int Get_max(node *p){return p?p->mx:0; } inline void update(node *p){p->mx=max(p->wt,max(Get_max(p->ch[0]),Get_max(p->ch[1]))); } void Rotate(node *x,int d){node *y=x->fa;if(y->fa&&y->pre)y->fa->ch[y==y->fa->ch[1]]=x;x->fa=y->fa;if(x->ch[d])x->ch[d]->fa=y;y->ch[!d]=x->ch[d];x->ch[d]=y;y->fa=x;swap(x->pre,y->pre);update(y); } void splay(node *x){node *y,*z;while(x->pre){y=x->fa;z=y->fa;if(!z||!y->pre){if(x==y->ch[0])Rotate(x,1);elseRotate(x,0);}else{if(y==z->ch[0])if(x==y->ch[0]){Rotate(y,1);Rotate(x,1);}else{Rotate(x,0);Rotate(x,1);}elseif(x==y->ch[1]){Rotate(y,0);Rotate(x,0);}else{Rotate(x,1);Rotate(x,0);}}}update(x); } void access(int a){node *x=&splay_tree[a],*y;splay(x);if(x->ch[1]){x->ch[1]->pre=0;x->ch[1]=0;}update(x);while(1){y=x->fa;if(!y)return;splay(y);if(y->ch[1])y->ch[1]->pre=0;y->ch[1]=x;x->pre=1;splay(x);}splay(x); } int query(int a){node *x=&splay_tree[a],*y;int ans;splay(x);if(!x->fa)return Get_max(x->ch[1]);if(x->ch[1]){x->ch[1]->pre=0;x->ch[1]=0;}update(x);while(1){y=x->fa;splay(y);ans=Get_max(y->ch[1]);if(y->ch[1])y->ch[1]->pre=0;y->ch[1]=x;x->pre=1;if(!y->fa){ans=max(ans,Get_max(x));splay(x);return ans;}splay(x);} } void solve(){char s[10];int a,b;while(scanf("%s",s),s[0]!='D')if(s[0]=='Q'){Read(a),Read(b);access(a);printf("%d\n",query(b));}else{Read(a),Read(b);access(e2id[a]);splay_tree[e2id[a]].wt=b;update(&splay_tree[e2id[a]]);} } int main() {Read(T);while(T--){memset(adj,0,sizeof adj);ecnt=edge;read();solve();} }轉(zhuǎn)載于:https://www.cnblogs.com/outerform/p/5921909.html
總結(jié)
以上是生活随笔為你收集整理的【高级数据结构】[SPOJ QTREE]树链剖分/动态树各一模板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 读书笔记 - 《重新定义公司:谷歌是如何
- 下一篇: Android之Activity的四种启