LCT 10pts 求调
查看原帖
LCT 10pts 求调
706523
AlicX楼主2023/12/6 18:58

rt,调了很久但毫无进展。

#include<bits/stdc++.h>
#define int long long 
#define x first 
#define y second
#define debug() puts("-----") 
using namespace std; 
typedef pair<int,int> pii; 
const int N=2e6+10; 
int n;
int m,k; 
int p[N]; 
int ans[N]; 
int val[N];
map<pii,bool> mp; 
struct Edge{
	int opt; int u,v,w; bool flg;
}e[N],q[N]; 
bool cmp(Edge a,Edge b){ return a.w<b.w; }
struct Node{
	int w,tag; 
	int fa,ch[2]; 
}tr[N]; 
int get(int x){ return (x==tr[tr[x].fa].ch[1]); } 
bool check(int x){ return (x!=tr[tr[x].fa].ch[0]&&x!=tr[tr[x].fa].ch[1]); } 
void pushup(int u){ 
	tr[u].w=max(val[u],max(tr[tr[u].ch[0]].w,tr[tr[u].ch[1]].w)); 
} 
void pushdown(int u){ 
	if(!tr[u].tag) return ; 
	swap(tr[tr[u].ch[0]].ch[0],tr[tr[u].ch[0]].ch[1]); 
	swap(tr[tr[u].ch[1]].ch[0],tr[tr[u].ch[1]].ch[1]); 
	tr[tr[u].ch[0]].tag^=1,tr[tr[u].ch[1]].tag^=1,tr[u].tag=0; 
} 
void update(int x){ 
	if(!check(x)) update(tr[x].fa); 
	pushdown(x); 
} 
void rotate(int x){ 
	int y=tr[x].fa,z=tr[y].fa,k=get(x); 
	if(!check(y)) tr[z].ch[get(y)]=x; tr[x].fa=z; 
	tr[y].ch[k]=tr[x].ch[k^1],tr[tr[x].ch[k^1]].fa=y; 
	tr[x].ch[k^1]=y,tr[y].fa=x; pushup(y); 
} 
void Splay(int x){ 
	update(x); 
	while(!check(x)){ 
		int y=tr[x].fa; 
		if(!check(y)){ 
			if(get(x)^get(y)) rotate(x); 
			else rotate(y); 
		} rotate(x); 
	} pushup(x); 
} 
int access(int x){ 
	int p=0; 
	while(x){ 
		Splay(x); 
		tr[x].ch[1]=p; 
		pushup(x); 
		p=x,x=tr[x].fa; 
	} return p; 
} 
void makeRoot(int x){ 
	access(x),Splay(x); 
	swap(tr[x].ch[0],tr[x].ch[1]); tr[x].tag^=1; 
} 
int Split(int x,int y){ 
	makeRoot(x); 
	access(y); 
	Splay(y); 
	return y; 
} 
int find(int x){ 
	access(x),Splay(x),pushdown(x); 
	while(tr[x].ch[0]) x=tr[x].ch[0],pushdown(x);  
	Splay(x); return x; 
} 
void link(int x,int y){ 
	makeRoot(x); 
	if(find(y)!=x) tr[x].fa=y; 
} 
void cut(int x,int y){ 
	Split(x,y); 
	if(tr[y].ch[0]==x&&!tr[y].ch[1]) tr[y].ch[0]=tr[x].fa=0,pushup(y);  
} 
int Find(int x,int w){
	if(val[x]==w) return x; 
	if(tr[tr[x].ch[0]].w==w) return Find(tr[x].ch[0],w); 
	return Find(tr[x].ch[1],w); 
}
int find_p(int x){
	if(p[x]!=x) p[x]=find_p(p[x]); 
	return p[x]; 
} 
void work(){ 
	for(int i=1;i<=n;i++) p[i]=i; 
	for(int i=1;i<=m;i++) val[i+n]=e[i].w; 
	for(int i=1;i<=m;i++){ 
		int u=e[i].u,v=e[i].v;
		if(mp[{u,v}]) continue;  
		int pa=find_p(u),pb=find_p(v); 
		if(pa!=pb) p[pa]=pb,link(u,n+i),link(v,n+i); 
	} 
}
signed main(){ 
	scanf("%lld%lld%lld",&n,&m,&k); 
	for(int i=1;i<=m;i++){
		scanf("%lld%lld%lld",&e[i].u,&e[i].v,&e[i].w); 
		if(e[i].u>e[i].v) swap(e[i].u,e[i].v); 
	} for(int i=1;i<=k;i++){
		scanf("%lld%lld%lld",&q[i].opt,&q[i].u,&q[i].v); 
		if(q[i].u>q[i].v) swap(q[i].u,q[i].v); 
		if(q[i].opt==2) mp[{q[i].u,q[i].v}]=true; 
	} sort(e+1,e+m+1,cmp); work(); mp.clear(); 
	for(int i=1;i<=m;i++) mp[{q[i].u,q[i].v}]=i; 
	for(int i=k;i>=1;i--){ 
		int opt=q[i].opt,u=q[i].u,v=q[i].v,x=Split(u,v); 
		if(opt==1) ans[i]=tr[x].w; 
		else{ 
			int id=Find(v,tr[x].w); 
			// cout<<"De "<<id<<endl;
			// cout<<tr[x].w<<" "<<val[n+mp[{u,v}]]<<endl; 
			if(tr[x].w>val[n+mp[{u,v}]]){ 
				cut(e[id-n].u,id); 
				cut(e[id-n].v,id); 
				// cout<<"De1 "<<e[id-n].u<<" "<<e[id-n].v<<" "<<id<<endl; 
				link(u,mp[{u,v}]+n); 
				link(v,mp[{u,v}]+n); 
				// cout<<"De2 "<<u<<" "<<v<<" "<<mp[{u,v}]+n<<endl; 
			} 
		} 
	} for(int i=1;i<=k;i++) if(q[i].opt==1) printf("%lld\n",ans[i]); 
	return 0; 
} 
2023/12/6 18:58
加载中...