性感代码,在线求条
查看原帖
性感代码,在线求条
1007817
hutao_sdog楼主2025/1/15 21:33

rt,第一个样例全输0,第二个样例直接RE

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10;
const ll inf=0x3f3f3f3f3f3f3f3f;
ll n,m,q,w[N];
ll dfn[N],low[N],ins=0;
ll st[N],top=0;
bool vis[N];
ll tot=0;
multiset<pair<ll,ll> > p[N];
vector<ll> g[N];
ll father[N],deep[N],Size[N],son[N];
ll id[N],rev[N],jump[N],t=0;
ll s[N*2];
ll head[N],cnt=0;
struct node{
	ll v,nex;
}e[N];
void add(ll u,ll v){
	e[++cnt].v=v;
	e[cnt].nex=head[u];
	head[u]=cnt;
}
void tarjan(ll u){
	dfn[u]=low[u]=++ins;
	st[++top]=u;
	vis[u]=1;
	for(int i=head[u];i;i=e[i].nex){
		ll v=e[i].v;
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
			if(dfn[u]==low[v]){
				tot++;
				ll z=0;
				do{
					z=st[top--];
					vis[z]=0;
					g[tot].push_back(z);
					g[z].push_back(tot);
				}while(z!=v);
				g[tot].push_back(u);
				g[u].push_back(tot);
			}
		}
		else if(vis[v]) low[u]=min(low[u],dfn[v]);
	}
}
void dfs1(ll u,ll fa){
	father[u]=fa;
	deep[u]=deep[fa]+1;
	Size[u]=1;
	if(u<=n) p[u].insert({w[u],u});
	for(ll v:g[u]){
		if(v==fa) continue;
		dfs1(v,u);
		if(u>n) p[u].insert({w[v],v});
		Size[u]+=Size[v];
		if(Size[v]>Size[son[u]]) son[u]=v;
	}
}
void dfs2(ll u,ll fa){
	if(son[u]){
		ll v=son[u];
		jump[v]=jump[u];
		id[v]=++t;
		rev[t]=v;
		dfs2(v,u);
	}
	for(ll v:g[u]){
		if(v==fa) continue;
		if(!jump[v]){
			jump[v]=v;
			id[v]=++t;
			rev[t]=v;
			dfs2(v,u);
		}
	}
}
void pushup(ll k){
	s[k]=min(s[k*2],s[k*2+1]);
}
void build(ll k,ll l,ll r){
	if(l==r){
		s[k]=(*p[rev[l]].begin()).first;
		return;
	}
	ll mid=(l+r)>>1;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	pushup(k);
}
void change(ll k,ll l,ll r,ll x){
	if(l==r){
		s[k]=(*p[rev[x]].begin()).first;
		return;
	}
	ll mid=(l+r)>>1;
	if(x<=mid) change(k*2,l,mid,x);
	else change(k*2+1,mid+1,r,x);
	pushup(k);
}
ll ask(ll k,ll l,ll r,ll x,ll y){
	if(x<=l&&r<=y){
		return s[k];
	}
	ll mid=(l+r)>>1,tmp=inf;
	if(x<=mid) tmp=min(tmp,ask(k*2,l,mid,x,y));
	if(y>mid) tmp=min(tmp,ask(k*2+1,mid+1,r,x,y));
	return tmp;
}
ll get(ll u,ll v){
	ll tmp=inf;
	while(jump[u]!=jump[v]){
		if(deep[jump[u]]<deep[jump[v]]) swap(u,v);
		tmp=min(tmp,ask(1,1,tot,id[jump[u]],id[u]));
		u=father[jump[u]];
	}
	if(deep[u]<deep[v]) swap(u,v);
	tmp=min(tmp,ask(1,1,tot,id[v],id[u]));
	if(v>n) tmp=min(tmp,w[father[v]]);
	return tmp;
}
int main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++) cin>>w[i];
	for(int i=1;i<=m;i++){
		ll u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	tot=n;
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i);
			top--;
		}
	}
	dfs1(1,0);
	dfs2(1,0);
	build(1,1,tot);
	while(q--){
		char op;
		ll a,b;
		cin>>op>>a>>b;
		if(op=='C'){
			p[a].erase({w[a],a});
			if(father[a]) p[father[a]].erase({w[a],a});
			w[a]=b;
			p[a].insert({w[a],a});
			if(father[a]) p[father[a]].insert({w[a],a});
			change(1,1,tot,id[a]);
			if(father[a]) change(1,1,tot,id[father[a]]);
		}
		else cout<<get(a,b)<<endl;
	}
	return 0;
}
2025/1/15 21:33
加载中...