社区讨论

30pts Substack1 过了 Substzck2对一个 其他全WA求调

P7924「EVOI-RD2」旅行家参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj93j1l
此快照首次捕获于
2025/11/03 22:44
4 个月前
此快照最后确认于
2025/11/03 22:44
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const long long maxn=5e5+10;
struct node{
	long long fr,to,next;
}edge[maxn*8+10],edge2[maxn*8+10];
long long n,m,vex[maxn],vex2[maxn],ei,ei2,cha[maxn];
void add(long long u ,long long v){
	edge[++ei].next=vex[u];
	vex[u]=ei;
	edge[ei].fr=u;
	edge[ei].to=v;
} 
void add2(long long u ,long long v){
	edge2[++ei2].next=vex2[u];
	vex2[u]=ei2;
	edge2[ei2].fr=u;
	edge2[ei2].to=v;
}
long long dfn[maxn],low[maxn],co[maxn],num,cnt,w1[maxn],w2[maxn];
stack<long long> s;
bool vis[maxn];
void tarjan(long long u,long long fa){
	dfn[u]=low[u]=++cnt;
	vis[u]=1;
	s.push(u);
	for(long long i=vex2[u];i;i=edge2[i].next){
		long long v=edge2[i].to;
		if(v==fa){
			continue;
		}
		if(!dfn[v]){
			tarjan(v,u);
			low[u]=min(low[u],low[v]);
		}else if(vis[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(dfn[u]==low[u]){
		++num;
		long long y;
		while(1){
			y=s.top();
			s.pop();
			vis[y]=0;
			w2[num]+=w1[y];
			co[y]=num;
			if(y==u){
				break;
			}
		}
	}
}
long long cd[maxn],rd[maxn],tp[maxn];
long long f[maxn][25],dep[maxn];
void dfs(long long u,long long fa){
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
//	cout<<1;
	for(long long i=vex[u];i;i=edge[i].next){
		long long v=edge[i].to;
		if(v!=fa){
			dfs(v,u); 
		}
	}
}
long long lca(long long x,long long y){
	if(dep[x]<dep[y]){
		swap(x,y);
	}
	for(long long i=20;i>=0;i--){
		if(dep[f[x][i]]>=dep[y]){
			x=f[x][i];
		}
	}
	if(x==y){
		return y;
	}
	for(long long i=20;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
long long ans=0;
void dfs2(long long u,long long fa){
	for(long long i=vex[u];i;i=edge[i].next){
		long long v=edge[i].to;
		if(v!=fa){
			dfs2(v,u); 
			cha[u]+=cha[v];
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(long long i=1;i<=n;i++){
		scanf("%d",&w1[i]);
	}
	for(long long i=1;i<=m;i++){
		long long u,v;
		scanf("%d%d",&u,&v);
		add2(u,v);
		add2(v,u);
	}
	for(long long i=1;i<=n;i++){
		if(!co[i]){
			tarjan(i,0);
		}
//		cout<<co[i]<<" ";
	}
//	cout<<endl;
	for(long long i=1;i<=m;i++){
		long long c1=co[edge2[i].fr],c2=co[edge2[i].to];
		if(c1!=c2){
			add(c1,c2);
			add(c2,c1);
			rd[c2]++;
			cd[c1]++;
		}
	}
	dfs(co[1],0);
	long long q;
	scanf("%d",&q);
	for(long long i=1;i<=q;i++){
		long long a,b;
		scanf("%d%d",&a,&b);
		a=co[a],b=co[b];
//		cout<<a<<" "<<b<<endl;
		if(co[a]==co[b]){
			cha[a]++;
			cha[f[a][0]]--;
		}else{
			cha[a]++;
			cha[b]++;
			long long t=lca(a,b);
			cha[t]--;
			cha[f[t][0]]--;
		}
	}
	dfs2(co[1],0);
	for(long long i=1;i<=num;i++){
		if(cha[i]>0){
			ans+=w2[i];
		}
	}
	cout<<ans;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...