LCT 50pts 求调,WA on#5~8
查看原帖
LCT 50pts 求调,WA on#5~8
399475
_XHY20180718_楼主2023/9/13 18:15

RT,帮我看看吧。

#include<bits/stdc++.h>
#define int long long
#define ls tr[x].s[0]
#define rs tr[x].s[1]
using namespace std;
const int N=2e5+5,inf=2e9;
int n,m,q,st[N],id;
map<pair<int,int>,int>mp;
struct Splay{
	int fa,s[2];
	int sz,id,w;
	bool fr;
}tr[N];
struct edge{
	int u,v,w,id;
}egs[N];
struct qry{
	int op,u,v,w;
}ans[N];
inline bool nroot(int x){return tr[tr[x].fa].s[0]==x||tr[tr[x].fa].s[1]==x;}
inline void chgr(int x){if(x)swap(ls,rs),tr[x].fr^=1;}
inline void pushdown(int x){if(tr[x].fr)chgr(ls),chgr(rs),tr[x].fr=0;}
inline void pushup(int x){
	tr[x].sz=tr[ls].sz+tr[rs].sz+1,tr[x].id=0;
	if(tr[tr[x].id].w<tr[x].w)tr[x].id=x;
	if(tr[tr[x].id].w<tr[tr[ls].id].w)tr[x].id=tr[ls].id;
	if(tr[tr[x].id].w<tr[tr[rs].id].w)tr[x].id=tr[rs].id;
}
inline void rotate(int x){
	int y=tr[x].fa,z=tr[y].fa,t;
	bool xy=(tr[y].s[1]==x),yz=(tr[z].s[1]==y);
	if(nroot(y))tr[z].s[yz]=x;tr[x].fa=z;
	t=tr[y].s[xy]=tr[x].s[!xy];if(t)tr[t].fa=y;
	tr[x].s[!xy]=y,tr[y].fa=x;pushup(y);
}
inline void splay(int x){
	int y=x,z=0;st[++z]=y;
	while(nroot(y))st[++z]=y=tr[y].fa;
	while(z)pushdown(st[z--]);
	while(nroot(x)){
		y=tr[x].fa,z=tr[y].fa;
		if(nroot(y))rotate((tr[y].s[1]==x^tr[z].s[1]==y)?x:y);
		rotate(x);
	}pushup(x);
}
inline void access(int x){for(int y=0;x;x=tr[y=x].fa)splay(x),rs=y,pushup(x);}
inline void makeroot(int x){access(x),splay(x),chgr(x);}
inline void split(int x,int y){makeroot(x),access(y),splay(y);}
inline int findroot(int x){access(x),splay(x);while(ls)pushdown(x=ls);splay(x);return x;} 
inline void link(int x,int y){makeroot(x);if(findroot(y)!=x)tr[x].fa=y;}
inline bool cmp(edge x,edge y){return x.id>y.id;}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>q,id=n;
	int op,u,v,w,j=q;
	for(int i=1; i<=m; ++i)
		cin>>u>>v>>w,egs[i]={u,v,w,inf},mp[{u,v}]=i;
	for(int i=1; i<=q; ++i){
		cin>>op>>u>>v;
		ans[i]=(qry){op,u,v,0};
		if(op==2)egs[mp[{u,v}]].id=i;
	}
	sort(egs+1,egs+1+m,cmp);
	for(int i=1,x; i<=m; ++i){
		for(; j>egs[i].id; --j)
			if(ans[j].op==1){
				u=ans[j].u,v=ans[j].v;
				split(u,v),ans[j].w=tr[tr[v].id].w;
			}
		u=egs[i].u,v=egs[i].v,w=egs[i].w;
		if(findroot(u)==findroot(v)){
			split(u,v),x=tr[v].id;
			if(tr[x].w<=w)continue;
			splay(x),tr[ls].fa=tr[rs].fa=0;
		}
		link(u,++id),link(v,id),splay(id);
		tr[id].w=w,tr[id].id=id;
	}
	while(--j)
		if(ans[j].op==1){
			u=ans[j].u,v=ans[j].v;
			split(u,v),ans[j].w=tr[tr[v].id].w;
		}
	for(int i=1; i<=q; ++i)
		if(ans[i].op==1)cout<<ans[i].w<<'\n';
	return 0;
}
2023/9/13 18:15
加载中...