萌新刚学OI,LCTWA40玄关求调
查看原帖
萌新刚学OI,LCTWA40玄关求调
795163
coderjmc楼主2024/7/14 12:18

代码:

#include<iostream>
#include<algorithm>
#include<map>
#define int long long
using namespace std;
struct st{
	int son[3],par,val;
	int sum,tag,siz;
}tr[200005];
struct nod{
	int u,v,a,b;
	bool operator<(nod x)const{
		if(a!=x.a)return a<x.a;
		return b<x.b;
	}
}edge[100005];
int f[100005];
int fd(int x){
	if(x==f[x])return x;
	return f[x]=fd(f[x]);
}
void puta(int u){
	swap(tr[u].son[0],tr[u].son[1]);
	tr[u].tag^=1;
}
void pushup(int u){
	int lc=tr[u].son[0],rc=tr[u].son[1];
	tr[u].sum=tr[u].val;
	if(lc && tr[lc].sum>tr[u].sum)tr[u].sum=tr[lc].sum;
	if(rc && tr[rc].sum>tr[u].sum)tr[u].sum=tr[rc].sum;
}
void pushdown(int u){
	if(tr[u].tag)puta(tr[u].son[0]),puta(tr[u].son[1]);
	tr[u].tag=0;
}
bool isro(int u){
	return tr[tr[u].par].son[0]!=u && tr[tr[u].par].son[1]!=u;
}
void rotate(int u){
	int f=tr[u].par,g=tr[f].par;
	int k=tr[f].son[1]==u;
	if(!isro(f))tr[g].son[tr[g].son[1]==f]=u;
	tr[u].par=g;
	tr[f].son[k]=tr[u].son[k^1],tr[tr[u].son[k^1]].par=f;
	tr[u].son[k^1]=f,tr[f].par=u;
	pushup(f),pushup(u);
}
int sta[100005];
void splay(int u){
	int top=0,roo=u;
	sta[++top]=u;
	while(!isro(roo))sta[++top]=roo=tr[roo].par;
	while(top)pushdown(sta[top--]);
	while(!isro(u)){
		int f=tr[u].par,g=tr[f].par;
		if(!isro(f)){
			if((tr[f].son[1]==u)^(tr[g].son[1]==f))rotate(u);
			else rotate(f);
		}
		rotate(u);
	} 
}
void access(int u){
	int b=u;
	for(int v=0;u;v=u,u=tr[u].par){
		splay(u);
		tr[u].son[1]=v,pushup(u);
	}
	splay(b);
}
void makeroot(int u){access(u);puta(u);}
int findroot(int u){
	access(u);
	while(tr[u].son[0])pushdown(u),u=tr[u].son[0];
	splay(u);
	return u;
}
void split(int u,int v){makeroot(u);access(v);}
void link(int u,int v){
	makeroot(u);
	if(findroot(v)!=u)tr[u].par=v,tr[u].siz++,tr[v].siz++;
}
void cut(int u,int v){
	makeroot(u);
	if(findroot(v)==u && tr[v].par==u && !tr[v].son[0]){
		tr[u].son[0]=tr[v].par=tr[v].val=0;
		pushup(u);
	}
}
map<int,int> mp[100005];
signed main(){
	cin.tie(0);cout.tie(0);
	ios::sync_with_stdio(false);
	int n,m,c,k;
	cin>>n>>m>>c>>k;
	for(int i=1;i<=n;i++){
		int v;
		cin>>v;
		for(int j=0;j<c;j++){
			tr[j*n+i].val=v;
		}
	}
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		link(w*n+u,w*n+v);
		mp[u][v]=mp[v][u]=w;
	}
	while(k--){
		int op;
		cin>>op;
		if(op==0){
			int x,y;
			cin>>x>>y;
			for(int i=0;i<c;i++){
				splay(x+i*n);
				tr[x+i*n].val=y;
				pushup(x+i*n);
			}
		}
		else if(op==1){
			int u,v,w;
			cin>>u>>v>>w;
			if(!mp[u].count(v)){
				cout<<"No such edge."<<endl;
				continue;
			}
			int id=mp[u][v],x=u+id*n,y=v+id*n;
			if(id==w){
				cout<<"Success."<<endl;
				continue;
			}
			if(tr[w*n+u].siz==2 || tr[w*n+v].siz==2){
				cout<<"Error 1."<<endl;
				continue;
			}
			makeroot(w*n+u);
			if(findroot(w*n+v)==w*n+u){
				cout<<"Error 2."<<endl;
				continue;
			}
			cout<<"Success."<<endl;
			cut(x,y);
			link(w*n+u,w*n+v);
			mp[u][v]=mp[v][u]=w;
		}
		else{
			int c,u,v;
			cin>>c>>u>>v;
			u=c*n+u,v=c*n+v;
			makeroot(u);
			if(findroot(v)!=u){
				cout<<-1<<endl;
				continue;
			}
			split(u,v);
			cout<<tr[v].sum<<endl;
		}
	}
}
2024/7/14 12:18
加载中...