悬观秋窕
查看原帖
悬观秋窕
590675
A1ex_5yn7ax楼主2025/7/25 12:58

为什么会RE...

#include<bits/stdc++.h>
using namespace std;
int n,m,q,cnt;
int val[400007];
int dfn[400007],low[400007],tim,F[400007];
stack<int> st;
vector<int> vec[400007],nvec[400007];
multiset<int> mt[400007]; 
void tarjan(int u){
	dfn[u]=low[u]=++tim;st.push(u);
	for(int i=0;i<vec[u].size();i++){
		int v=vec[u][i];
		if(F[u]==v) continue;
		if(!dfn[v]){
			F[v]=u;
			tarjan(v);
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				cnt++;int y;
				do{
					y=st.top();st.pop();
					nvec[y].push_back(cnt);nvec[cnt].push_back(y);
					mt[cnt].insert(val[y]);
				}while(y!=v);
				mt[cnt].insert(val[u]);
				val[cnt]=*mt[cnt].begin();
				nvec[u].push_back(cnt);nvec[cnt].push_back(u);
			}
		}
		else low[u]=min(low[u],dfn[v]);
	}
}
int son[400007],id[400007],fa[400007],tot,dep[400007],siz[400007],top[400007];
void dfs1(int u,int f,int deep){
	dep[u]=deep;fa[u]=f;siz[u]=1;
	int ms=-1;
	for(int i=0;i<nvec[u].size();i++){
		int v=nvec[u][i];
		if(v==f) continue;
		dfs1(v,u,deep+1);
		siz[u]+=siz[v];
		if(siz[v]>ms) son[u]=v,ms=siz[v];
	}
}
int tval[400007];
void dfs2(int u,int topf){
	id[u]=++tot;
	tval[tot]=val[u];
	top[u]=topf;
	if(!son[u]) return ;
	dfs2(son[u],topf);
	for(int i=0;i<nvec[u].size();i++){
		int v=nvec[u][i];
		if(v==fa[u]||v==son[u]) continue;
		dfs2(v,v);
	}
}
int tr[1000000];
void built(int u,int l,int r){
	if(l==r){tr[u]=tval[l];return ;}
	int mid=(l+r)>>1,lk=u<<1,rk=lk|1;
	built(lk,l,mid),built(rk,mid+1,r);
	tr[u]=min(tr[lk],tr[rk]);
}
void change(int u,int l,int r,int po,int x){
	if(l==r){tr[u]=x;return ;} 
	int mid=(l+r)>>1,lk=u<<1,rk=lk|1;
	if(po<=mid) change(lk,l,mid,po,x);
	else change(rk,mid+1,r,po,x);
	tr[u]=min(tr[lk],tr[rk]);
}
int query(int u,int l,int r,int L,int R){
	if(L<=l&&R>=r) return tr[u];
	int mid=(l+r)>>1,lk=u<<1,rk=lk|1;
	int ans=0x3f3f3f3f;
	if(L<=mid) ans=min(ans,query(lk,l,mid,L,R));
	if(R>mid) ans=min(ans,query(rk,mid+1,r,L,R));
	return ans;
}
int qr(int u,int v){
	int ans=0x3f3f3f3f;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		ans=min(ans,query(1,1,cnt,id[top[u]],id[u]));
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	ans=min(ans,query(1,1,cnt,id[u],id[v]));
	return ans;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
    cin>>n>>m>>q;cnt=n;
    for(int i=1;i<=n;i++) cin>>val[i];
    for(int i=1,u,v;i<=m;i++){
    	cin>>u>>v;
    	vec[u].push_back(v);
    	vec[v].push_back(u);
	}
	tarjan(1);
	for(int i=1;i<=cnt;i++) tr[i]=0x3f3f3f3f; 
	dfs1(1,0,1);
	dfs2(1,1);
	built(1,1,cnt);
	char opt;int a,b;
	while(q--){
		cin>>opt>>a>>b;
		if(opt=='C'){
			int ta=id[a];
			change(1,1,cnt,ta,b);
			for(int i=0;i<nvec[a].size();i++){
				int v=nvec[a][i],best=*mt[v].begin(),cbest;
			    mt[v].erase(mt[v].find(tval[ta]));
			    mt[v].insert(b);
			    if((cbest=*mt[v].begin())!=best) change(1,1,cnt,id[v],cbest);
			}
			tval[a]=b;
		}
		if(opt=='A') cout<<qr(a,b)<<'\n';
	}
	return 0;
}

2025/7/25 12:58
加载中...