求一波差错
查看原帖
求一波差错
115857
too_later楼主2020/11/4 20:18

RT,感觉 LCT 没问题,感觉是下面操作矛盾了。

跪求大佬解答。

#include<bits/stdc++.h>
#define I inline
#define ls ch[p][0]
#define rs ch[p][1]
#define chk printf("CaO ")
using namespace std;
const int N = 300005;

int n,m,q,top,ans[N],x,y,z,xx[N],yy[N],lne[105][105],dis[105][105];
int op[N],X[N],Y[N],st[N],f[N],ch[N][2],val[N],ma[N],tag[N];
I void down(int p){
	if(!tag[p])return;
	ls^=rs^=ls^=rs;tag[ls]^=1,tag[rs]^=!(tag[p]=0);
} I void up(int p){
	down(ls),down(rs);ma[p]=p;
	if(ls)if(val[ma[ls]]>val[ma[p]])ma[p]=ma[ls];
	if(rs)if(val[ma[rs]]>val[ma[p]])ma[p]=ma[rs];
} I int get(int p){return p==ch[f[p]][1]; }
I int isroot(int p){return p!=ch[f[p]][0]&&p!=ch[f[p]][1];}
I void rotate(int x){
	int y=f[x],z=f[y],k=get(x);if(!isroot(y))ch[z][ch[z][1]==y]=x;
	f[ch[y][k]=ch[x][!k]]=y,f[ch[x][!k]=y]=x,f[x]=z,up(y),up(x);if(z)up(z);
}
I void splay(int x){
	int i=x;st[top=1]=i;while(!isroot(i))st[++top]=i=f[i];
	while(top)down(st[top--]);
	for(int fa;fa=f[x],!isroot(x);rotate(x))
		if(!isroot(fa))rotate(get(fa)==get(x)?fa:x);
}
I void access(int p){
	for(int q=0;p;p=f[q=p])splay(p),rs=q,up(p);
}
I void makeroot(int p){
	access(p),splay(p),tag[p]^=1;
}
I void split(int x,int y){
	makeroot(x),access(y),splay(y);
}
I int findroot(int p){
	access(p),splay(p);while(ls)p=ls;return p;
}
I void link(int x,int y){
	makeroot(x);f[x]=y;
}
I void cut(int x,int y){
	split(x,y);
	ch[y][0]=f[x]=0;
	up(y);
}
map<int, map<int, int> > mp;
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&x,&y,&z),
		mp[xx[i]=x][yy[i]=y]=mp[y][x]=1,val[i+n]=z,lne[x][y]=lne[y][x]=i,dis[x][y]=dis[y][x]=z;
	for(int i=1;i<=q;i++)
		scanf("%d%d%d",&op[i],&X[i],&Y[i]),(op[i]==2?mp[X[i]][Y[i]]=mp[Y[i]][X[i]]=0:0);
	for(map< int , map< int , int > > :: iterator it1=mp.begin();it1!=mp.end();it1++)
		for(map<int,int> :: iterator it2=it1->second.begin();it2!=it1->second.end();it2++){
			if(!(it2->second))continue;
			mp[y=(it2->first)][x=(it1->first)]=0;int i=lne[x][y];
			if(findroot(x)!=findroot(y))
				printf("%d %d %d\n",x,i+n,y),link(x,i+n),link(i+n,y);
			else{
				split(x,y);
				int mi=ma[y];
				if(val[mi]<=dis[x][y])continue;
				cut(xx[mi-n],mi);
				cut(mi,yy[mi-n]);
				link(x,i+n);
				link(i+n,y);
			}
		}
	for(;q;q--){
		if(op[q]==1){
			split(X[q],Y[q]);
			ans[++ans[0]]=val[ma[Y[q]]];
		} else {
			int i=lne[X[q]][Y[q]]+n;
			split(X[q],Y[q]);
			if(val[ma[Y[q]]]<=dis[X[q]][Y[q]])continue;
			int mi=ma[Y[q]];
			cut(xx[mi-n],mi);
			cut(mi,yy[mi-n]);
			link(X[q],i+n);
			link(i+n,Y[q]);
		}
	}
	for(int i=ans[0];i;i--)printf("%d\n",ans[i]);
	return 0;
}
2020/11/4 20:18
加载中...