洛谷 2173 [ZJOI2012]网络

【题解】

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

  1 #include<cstdio>
  2 #include<algorithm>
  3 #define N 500010
  4 #define C 20
  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];
 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     makeroot(c,x); fa[c][x]=y;
 61 }
 62 inline void cut(int c,int x,int y){
 63     split(c,x,y); int t=son[c][y][0];
 64     if(!son[c][t][1]&&t==x)
 65         son[c][y][0]=0,fa[c][x]=0,cnt[c][x]--,cnt[c][y]--;
 66     else{
 67         while(son[c][t][1]) t=son[c][t][1];
 68         if(t==x)
 69             son[c][fa[c][t]][0]=0,fa[c][x]=0,cnt[c][x]--,cnt[c][y]--;
 70     }
 71 }
 72 inline bool haveedge(int c,int x,int y){
 73     split(c,x,y); int t=son[c][y][0];
 74     if(!son[c][t][1]&&t==x) return 1;
 75     else{
 76         while(son[c][t][1]) t=son[c][t][1];
 77         if(t==x) return 1;
 78     }
 79     return 0;
 80 }
 81 int main(){
 82     n=read(); m=read(); c=read()-1; k=read();
 83     for(rg int i=1;i<=n;i++){
 84         val[i]=read();
 85         for(rg int j=0;j<=c;j++) mx[j][i]=val[i];
 86     }
 87     for(rg int i=1;i<=m;i++){
 88         x=read(); y=read(); w=read();
 89         link(w,x,y);
 90     }
 91     while(k--){
 92         if((opt=read())==0){
 93             x=read(),y=read();
 94             for(rg int i=0;i<=c;i++) access(i,x),splay(i,x);
 95             val[x]=y;
 96             for(rg int i=0;i<=c;i++) pushup(i,x);
 97         }
 98         if(opt==1){
 99             x=read(),y=read(),w=read(); bool linked=0; int lastcol=0;
100             for(rg int i=0;i<=c;i++)if(haveedge(i,x,y)){
101                 linked=1; lastcol=i; break;
102             }
103             if(lastcol==w&&linked){
104                 puts("Success."); continue;
105             }
106             if(!linked){
107                 puts("No such edge."); continue;
108             }
109             if(cnt[w][x]>=2||cnt[w][y]>=2){
110                 puts("Error 1."); continue;
111             }
112             if(find(w,x)==find(w,y)){
113                 puts("Error 2."); continue;
114             }
115             cut(lastcol,x,y); link(w,x,y); puts("Success.");
116         }
117         if(opt==2){
118             w=read(); x=read(); y=read();
119             if(find(w,x)!=find(w,y)){
120                 puts("-1"); continue;
121             }
122             split(w,x,y); printf("%d\n",mx[w][y]);
123         }
124     }
125 }

原文地址:https://www.cnblogs.com/DriverLao/p/8781191.html

时间: 2024-11-05 16:06:38

洛谷 2173 [ZJOI2012]网络的相关文章

洛谷 P2038 无线网络发射器选址(NOIp2014D2T1)

题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 1 .东西向街道从北到南依次编号为0,1,2-128 , 南北向街道从西到东依次编号为0,1,2-128 . 东西向街道和南北向街道相交形成路口,规定编号为x 的南北向街道和编号为y 的东西向街道形成的路口的坐标是(x , y ). 在 某 些 路口存在一定数量的公共

洛谷 P1546 最短网络 Agri-Net Label:Water最小生成树

题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所有的农场. 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案.每两个农场间的距离不会超过100000 输入输出格式 输入格式: 第一行: 农场的个数,N(3<=N<=100). 第二行..结尾: 后来的行包含了一

洛谷P1546 最短网络 Agri-Net

P1546 最短网络 Agri-Net 526通过 959提交 题目提供者JOHNKRAM 标签图论贪心USACO 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 50分C++代码,求解 请指教哪里出现了问题,只有… 求解为什么只有40分 题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所

洛谷 P1546 最短网络 Agri-Net x

题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所有的农场. 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案.每两个农场间的距离不会超过100000 输入输出格式 输入格式: 第一行: 农场的个数,N(3<=N<=100). 第二行..结尾: 后来的行包含了一

洛谷2038 无线网络发射器选址

题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网.假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 1 .东西向街道从北到南依次编号为0,1,2…128 , 南北向街道从西到东依次编号为0,1,2…128 . 东西向街道和南北向街道相交形成路口,规定编号为x 的南北向街道和编号为y 的东西向街道形成的路口的坐标是(x ,  y ). 在 某 些 路口存在一定数量的公共

洛谷 P2038 无线网络发射器选址

P2038 无线网络发射器选址 注意边界是否小于0 1 #include<bits/stdc++.h> 2 using namespace std; 3 int d,n,num[1000][1000],ans[1000][1000],tot,cnt,maxx; 4 int main() 5 { 6 scanf("%d",&d); 7 scanf("%d",&n); 8 memset(num,0,sizeof(num)); 9 memset

洛谷 P1262 间谍网络==Codevs 4093 EZ的间谍网络

4093 EZ的间谍网络 时间限制: 10 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报.所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子.因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报. 我们的反间谍机关

洛谷 P1546 最短网络 Agri-Net

最短网络Agri-Net [问题描述] 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助.约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所有的农场.你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案.每两个农场间的距离不会超过100000. [输入格式] 第一行: 农场的个数,N(3<=N<=100). 第二行..结尾 后来的行包含

[NOIP2014] 提高组 洛谷P2038 无线网络发射器选址

题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 1 .东西向街道从北到南依次编号为0,1,2…128 , 南北向街道从西到东依次编号为0,1,2…128 . 东西向街道和南北向街道相交形成路口,规定编号为x 的南北向街道和编号为y 的东西向街道形成的路口的坐标是(x , y ). 在 某 些 路口存在一定数量的公共