博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 2173 BZOJ 2816 [ZJOI2012]网络
阅读量:5239 次
发布时间:2019-06-14

本文共 4788 字,大约阅读时间需要 15 分钟。

【题解】

  明显的LCT模板题,c种颜色就开c棵LCT好了。。

1 #include
2 #include
3 #define N 100010 4 #define C 11 5 #define rg register 6 #define ls (son[c][u][0]) 7 #define rs (son[c][u][1]) 8 using namespace std; 9 int n,m,c,k,opt,x,y,w,top; 10 int cnt[C][N],fa[C][N],son[C][N][2],val[N],mx[C][N],rev[C][N],st[N],to[C][N][2]; 11 inline int read(){ 12 int k=0,f=1; char c=getchar(); 13 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 14 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 15 return k*f; 16 } 17 inline bool isroot(int c,int u){ 18 return son[c][fa[c][u]][1]!=u&&son[c][fa[c][u]][0]!=u; 19 } 20 inline bool which(int c,int u){ 21 return son[c][fa[c][u]][1]==u; 22 } 23 inline void pushup(int c,int u){ 24 mx[c][u]=max(max(mx[c][ls],mx[c][rs]),val[u]); 25 } 26 inline void pushdown(int c,int u){ 27 rev[c][ls]^=1; rev[c][rs]^=1; rev[c][u]=0; swap(ls,rs); 28 } 29 void rotate(int c,int u){ 30 int f=fa[c][u],gf=fa[c][f],wh=which(c,u); 31 if(!isroot(c,f)) son[c][gf][which(c,f)]=u; 32 fa[c][u]=fa[c][f]; fa[c][f]=u; fa[c][son[c][u][wh^1]]=f; 33 son[c][f][wh]=son[c][u][wh^1]; son[c][u][wh^1]=f; 34 pushup(c,f); pushup(c,u); 35 } 36 inline void splay(int c,int u){ 37 st[top=1]=u; 38 for(rg int i=u;!isroot(c,i);i=fa[c][i]) st[++top]=fa[c][i]; 39 for(rg int i=top;i;i--) if(rev[c][st[i]]) pushdown(c,st[i]); 40 while(!isroot(c,u)){ 41 if(!isroot(c,fa[c][u])) rotate(c,which(c,u)==which(c,fa[c][u])?fa[c][u]:u); 42 rotate(c,u); 43 } 44 } 45 inline void access(int c,int u){ 46 for(rg int s=0;u;s=u,u=fa[c][u]) splay(c,u),son[c][u][1]=s,pushup(c,u); 47 } 48 inline void makeroot(int c,int u){ 49 access(c,u); splay(c,u); rev[c][u]^=1; 50 } 51 inline int find(int c,int u){ 52 access(c,u); splay(c,u); 53 while(ls) u=ls; return u; 54 } 55 inline void split(int c,int x,int y){ 56 makeroot(c,x); access(c,y); splay(c,y); 57 } 58 inline void link(int c,int x,int y){ 59 cnt[c][x]++; cnt[c][y]++; 60 if(to[c][x][0]==-1) to[c][x][0]=y; else to[c][x][1]=y; 61 if(to[c][y][0]==-1) to[c][y][0]=x; else to[c][y][1]=x; 62 makeroot(c,x); fa[c][x]=y; 63 } 64 inline void cut(int c,int x,int y){ 65 split(c,x,y); int t=son[c][y][0]; 66 if(!son[c][t][1]&&t==x){ 67 son[c][y][0]=0,fa[c][x]=0,cnt[c][x]--,cnt[c][y]--; 68 if(to[c][x][0]==y) to[c][x][0]=-1; else to[c][x][1]=-1; 69 if(to[c][y][0]==x) to[c][y][0]=-1; else to[c][y][0]=-1; 70 } 71 else{ 72 while(son[c][t][1]) t=son[c][t][1]; 73 if(t==x){ 74 son[c][fa[c][t]][0]=0,fa[c][x]=0,cnt[c][x]--,cnt[c][y]--; 75 if(to[c][x][0]==y) to[c][x][0]=-1; else to[c][x][1]=-1; 76 if(to[c][y][0]==x) to[c][y][0]=-1; else to[c][y][0]=-1; 77 } 78 } 79 } 80 inline bool haveedge(int c,int x,int y){ 81 split(c,x,y); int t=son[c][y][0]; 82 if(!son[c][t][1]&&t==x) return 1; 83 else{ 84 while(son[c][t][1]) t=son[c][t][1]; 85 if(t==x) return 1; 86 } 87 return 0; 88 } 89 int main(){ 90 n=read(); m=read(); c=read()-1; k=read(); 91 for(rg int i=1;i<=n;i++){ 92 val[i]=read(); 93 for(rg int j=0;j<=c;j++) mx[j][i]=val[i]; 94 } 95 for(rg int i=1;i<=m;i++){ 96 x=read(); y=read(); w=read(); 97 link(w,x,y); 98 } 99 while(k--){100 if((opt=read())==0){101 x=read(),y=read();102 for(rg int i=0;i<=c;i++) access(i,x),splay(i,x);103 val[x]=y;104 for(rg int i=0;i<=c;i++) pushup(i,x);105 }106 if(opt==1){107 x=read(),y=read(),w=read(); bool linked=0; int lastcol=0;108 for(rg int i=0;i<=c;i++)if(haveedge(i,x,y)){109 linked=1; lastcol=i; break;110 }111 // for(rg int i=0;i<=c;i++)if(to[i][x][0]==y||to[i][x][1]==y){112 // linked=1; lastcol=i; break;113 // } 114 if(lastcol==w&&linked){115 puts("Success."); continue;116 }117 if(!linked){118 puts("No such edge."); continue;119 }120 if(cnt[w][x]>=2||cnt[w][y]>=2){121 puts("Error 1."); continue;122 }123 if(find(w,x)==find(w,y)){124 puts("Error 2."); continue;125 }126 cut(lastcol,x,y); link(w,x,y); puts("Success.");127 }128 if(opt==2){129 w=read(); x=read(); y=read();130 if(find(w,x)!=find(w,y)){131 puts("-1"); continue;132 }133 split(w,x,y); printf("%d\n",mx[w][y]);134 }135 }136 }
View Code

 

转载于:https://www.cnblogs.com/DriverLao/p/8781191.html

你可能感兴趣的文章
HDU 5763 Another Meaning (kmp + dp)
查看>>
常用DOS指令备忘
查看>>
SQL语句使用详解
查看>>
一起来构建前端工具链吧~(开发项目)
查看>>
Redmine2.0.3+Mysql55+RailsInstaller2.1.0+Win7成功安装记录(适用于Redmine2.3.0)
查看>>
Flexible 弹性盒子模型之CSS flex-basis 属性
查看>>
mysql(5.7)在CentOs7下的安装、配置与应用
查看>>
List Comprehension ()(一)
查看>>
Python的3个方法:静态方法(staticmethod),类方法(classmethod)和实例方法
查看>>
下载数据库包
查看>>
AngularJs的UI组件ui-Bootstrap
查看>>
HttpURLConnection、HttpClient和Session
查看>>
通过PowerShell卸载所有的SharePoint 2010 解决方案
查看>>
[LeetCode] 74. Search a 2D Matrix_Medium tag: Binary Search
查看>>
[Java in NetBeans] Lesson 14. ArrayList and Collections
查看>>
hibernate性能优化
查看>>
二叉树的下一个结点
查看>>
HDU 1527 取石子游戏(威佐夫博弈)
查看>>
单线程单元(STA)线程都应使用泵式等待基元
查看>>
Intent使用Parcelable传递对象
查看>>