ZJOI2012网络--LCT强化练习
2017-01-21 21:35
295 查看
太强了!!!!!!!!
#include<iostream> #include<cstdio> #include<map> using namespace std; const int maxn=10005,maxc=10; #define mp make_pair int val[maxn]; struct Link_Cut_Tree{ int Max[maxn],fa[maxn],deg[maxn],ch[maxn][2]; bool rev[maxn]; bool is_root(int p){ return (p!=ch[fa[p]][0])&&(p!=ch[fa[p]][1]); } void push_up(int p){ Max[p]=val[p]; if(Max[ch[p][0]]>Max[p])Max[p]=Max[ch[p][0]]; if(Max[ch[p][1]]>Max[p])Max[p]=Max[ch[p][1]]; } void push_down(int p){ if(rev[p]){ rev[p]=0; rev[ch[p][0]]^=1; rev[ch[p][1]]^=1; swap(ch[p][0],ch[p][1]); } } void push(int p){ if(!is_root(p))push(fa[p]); push_down(p); } void rotate(int u,int p,bool k){ if(!is_root(p)) ch[fa[p]][p==ch[fa[p]][1]]=u; fa[ch[u][k^1]]=p,fa[u]=fa[p],fa[p]=u; ch[p][k]=ch[u][k^1],ch[u][k^1]=p; push_up(p); } void splay(int u){ push(u); while(!is_root(u)) rotate(u,fa[u],u==ch[fa[u]][1]); push_up(u); } void access(int u){ int v=0; while(u){ splay(u); ch[u][1]=v; u=fa[v=u]; } } void set_root(int u){ access(u),splay(u),rev[u]^=1; } void link(int u,int v){ deg[u]++,deg[v]++; set_root(u),fa[u]=v; } void cut(int u,int v){ deg[u]--,deg[v]--; set_root(u); access(v),splay(v); fa[u]=ch[v][0]=0; } int find(int u){ while(fa[u])u=fa[u]; return u; } int query(int u,int v){ if(find(u)!=find(v))return -1; set_root(u); access(v),splay(v); return Max[v]; } }T[maxc]; map<pair<int,int>,int>col; int main(){ int n,m,C,Q; scanf("%d%d%d%d",&n,&m,&C,&Q); for(int i=1;i<=n;i++) scanf("%d",&val[i]); while(m--){ int u,v,w; scanf("%d%d%d",&u,&v,&w); col[mp(u,v)]=col[mp(v,u)]=w; T[w].link(u,v); } while(Q--){ int type,u,v,w; scanf("%d",&type); if(type==0){ scanf("%d%d",&u,&v),val[u]=v; for(int i=0;i<C;i++)T[i].splay(u); }else if(type==1){ scanf("%d%d%d",&u,&v,&w); if(!col.count(mp(u,v)))puts("No such edge."); else if(col[mp(u,v)]==w)puts("Success."); else if((T[w].deg[u]>=2)||(T[w].deg[v]>=2))puts("Error 1."); else if(T[w].find(u)==T[w].find(v))puts("Error 2."); else{ puts("Success."); T[col[mp(u,v)]].cut(u,v); col[mp(u,v)]=col[mp(v,u)]=w; T[w].link(u,v); } }else{ scanf("%d%d%d",&w,&u,&v); printf("%d\n",T[w].query(u,v)); } } return 0; }
相关文章推荐
- [BZOJ2816][ZJOI2012]网络(LCT)
- 【bzoj2816】【ZJOI2012】【网络】【lct】
- BZOJ.2816.[ZJOI2012]网络(LCT)
- LCT——BZOJ2816/Luogu2173 [ZJOI2012]网络
- [BZOJ2816][ZJOI2012]网络(lct+map)
- [ZJOI2012][bzoj 2816] 网络 network [LCT]
- [BZOJ2816][ZJOI2012]网络(LCT)
- bzoj2816 [ZJOI2012]网络(lct)
- ZJOI2012 网络——LCT相关题目
- 【bzoj2816】[ZJOI2012]网络 LCT
- [bzoj2816][ZJOI2012]网络(LCT,splay)
- Splay [ZJOI2012网络]
- 洛谷P2173 [ZJOI2012]网络
- bzoj千题计划223:bzoj2816: [ZJOI2012]网络
- BZOJ2816:[ZJOI2012]网络——题解
- [BZOJ2816][ZJOI2012]网络-Link Cut Tree
- BZOJ 2816 [ZJOI2012]网络
- [ZJOI2012]网络
- bzoj2816 [ZJOI2012]网络
- [ZJOI2012]网络 解题报告