TLE on 29,悬5关
  • 板块CF487E Tourists
  • 楼主STARSczy
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/4/8 17:30
  • 上次更新2024/4/8 20:14:45
查看原帖
TLE on 29,悬5关
656765
STARSczy楼主2024/4/8 17:30

rt

#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),i##end=(r);i<=i##end;++i)
#define per(i,r,l) for(int i=(r),i##end=(l);i>=i##end;--i)
#define int long long
#define double long double
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
using namespace std;
const int maxn=2e5+10,maxm=1e6+10,mod=1e9+7;
inline int read(){
	int c,w=0,n=0;
	while((c=getchar())<'0'||'9'<c) w=c=='-';
	do n=n*10+c-'0';while('0'<=(c=getchar())&&c<='9');
	return w?-n:n;
}
int write(int n){
	if(n<0) putchar('-'),n=-n;
	if(n>9) write(n/10);
	putchar(n%10+'0');
	return n;
}

int n,m,q,ett,dft,stt,qcnt,a[maxn],st[maxn],dfn[maxn],low[maxn];
int fa[maxn],sz[maxn],dep[maxn],hs[maxn],lt[maxn],tmp[maxn],sg[maxn<<2];
multiset<pii> mn[maxn];
vector<int> e[maxn],g[maxn];
void change(int id,int l,int r,int x,int w){
	if(l==r){
		sg[id]=w;
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) change(id<<1,l,mid,x,w);
	else change(id<<1|1,mid+1,r,x,w);
	sg[id]=min(sg[id<<1],sg[id<<1|1]);
}
int query(int id,int l,int r,int lq,int rq){
	if(lq<=l&&r<=rq) return sg[id];
	int mid=l+r>>1,ans=INT_MAX;
	if(lq<=mid) ans=min(ans,query(id<<1,l,mid,lq,rq));
	if(rq>mid) ans=min(ans,query(id<<1|1,mid+1,r,lq,rq));
	return ans;
}
void tarjan(int x){
	int tmp=0;
	low[x]=dfn[x]=++dft,st[++stt]=x;
	for(int i:e[x]) if(dfn[i]) low[x]=min(low[x],dfn[i]);
	else{
		tarjan(i),low[x]=min(low[x],low[i]),++tmp;
		if(low[i]>=dfn[x]){
			dfn[++n]=INT_MAX,g[n].pb(x),g[x].pb(n),mn[n].insert({a[x],x});
			do g[st[stt]].pb(n),g[n].pb(st[stt]),mn[n].insert({a[st[stt]],st[stt]});
			while(st[stt--]!=i);
			a[n]=mn[n].begin()->first;
		}
	}
}
void dfs1(int x){
	sz[x]=1;
	for(int i:g[x]) if(i!=fa[x]){
		fa[i]=x,dep[i]=dep[x]+1,sz[x]+=sz[i],dfs1(i);
		if(sz[i]>sz[hs[x]]) hs[x]=i;
	}
}
void dfs2(int x){
	change(1,1,n,dfn[x]=++dft,a[x]);
	if(!lt[x]) lt[x]=x;
	if(hs[x]) lt[hs[x]]=lt[x],dfs2(hs[x]);
	for(int i:g[x]) if(i!=fa[x]&&i!=hs[x]) dfs2(i);
}

signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
	cin>>n>>m>>q;
	rep(i,1,n) cin>>a[i];
	rep(i,1,m){
		int u,v;
		cin>>u>>v,e[u].pb(v),e[v].pb(u);
	}
	tarjan(1),dft=0,dfs1(1),dfs2(1);
	rep(i,1,n) qcnt+=g[i].size();
	rep(o,1,q){
		char opt;
		int u,v,ans=INT_MAX;
		cin>>opt>>u>>v,qcnt=0;
		if(opt=='C'){
			if(fa[u]) mn[fa[u]].erase({a[u],u}),mn[fa[u]].insert({v,u}),
				change(1,1,n,dfn[fa[u]],mn[fa[u]].begin()->first);
			if(hs[u]&&mn[hs[u]].size()) mn[hs[u]].erase({a[u],u}),mn[hs[u]].insert({v,u}),
				change(1,1,n,dfn[hs[u]],mn[hs[u]].begin()->first);
			a[u]=v,change(1,1,n,dfn[u],v);
		}
		else{
			while(lt[u]!=lt[v]){
				++qcnt;
				if(dep[lt[u]]<dep[lt[v]]) swap(u,v);
				if(fa[lt[u]]&&mn[lt[u]].size()&&mn[lt[u]].begin()->second==fa[lt[u]]&&mn[lt[u]].begin()->first!=a[fa[lt[u]]])
					mn[lt[u]].erase(mn[lt[u]].begin()),mn[lt[u]].insert({a[fa[lt[u]]],fa[lt[u]]}),
					change(1,1,n,dfn[lt[u]],mn[lt[u]].begin()->first);
				ans=min(ans,query(1,1,n,dfn[lt[u]],dfn[u])),u=fa[lt[u]];
//				cout<<"a";
			}
			if(dep[u]>dep[v]) swap(u,v);
			if(fa[u]&&mn[u].size()&&mn[u].begin()->second==fa[u]&&mn[u].begin()->first!=a[fa[u]])
				mn[u].erase(mn[u].begin()),mn[u].insert({a[fa[u]],fa[u]}),
				change(1,1,n,dfn[u],mn[u].begin()->first);
			ans=min(ans,query(1,1,n,dfn[u],dfn[v])),cout<<ans<<'\n';
		}
	}
//	cerr<<qcnt;
	return 0;
}/*
5 6 6
124820425 698207180 616852002 952907056 696244135
2 1
1 3
2 3
1 4
1 5
5 4
C 1 794202849
A 3 1
C 3 881984762
A 4 1
A 4 3
A 3 4

*/
2024/4/8 17:30
加载中...