有人吗?救救孩子!!
查看原帖
有人吗?救救孩子!!
544446
Demon_master楼主2021/12/17 23:50

本人题目测评结果(链接)

#include<bits/stdc++.h>
using namespace std;
const long long maxn=2e6+99,maxm=2e6*2+12;
long long n,m,q;
long long dianpuan[maxn];
struct P{
	long long f,t,n;
}edge_old[2*maxm];
long long head_old[maxn],l_old;

stack<int> p;
long long dfn[maxn],low[maxn],belong[maxn],tme,tot,power[maxn];
void tarjain(long long s,long long fa){
	p.push(s);
	dfn[s]=low[s]=++tme;
	for(long long i=head_old[s];i;i=edge_old[i].n){
		long long t=edge_old[i].t;
		if(t==fa) continue;
		if(dfn[t]==0){
			tarjain(t,s);
			low[s]=min(low[s],low[t]);
		}
		else low[s]=min(dfn[t],low[s]);
	}
	if(dfn[s]==low[s]){
		long long q;
		tot++;
		while(1){
			q=p.top();
			p.pop();
			belong[q]=tot;
			power[tot]+=dianpuan[q];
			if(q==s) break;
		}
	}
}

P edge[2*maxm];
long long head[maxn],l;
inline void build(){
	for(long long i=1;i<=m;i++){
		long long f=belong[edge_old[i].f],t=belong[edge_old[i].t];
		if(f==t) continue;
		l++,edge[l]=(P){f,t,head[f]},head[f]=l;
	}
}

long long C[maxn];
long long lca[maxn][31],dep[maxn];
void dfs(long long s,long long fa){
	dep[s]=dep[fa]+1;
	for(long long i=1;(i<<1)<=dep[s];i++) lca[s][i]=lca[lca[s][i-1]][i-1];
	for(long long i=head[s];i;i=edge[i].n){
		long long t=edge[i].t;
		if(t==fa) continue;
		lca[t][0]=s;
		dfs(t,s);
	}
}

long long getlca(long long a,long long b){
	if(dep[a]>dep[b]) swap(a,b);
	long long len=dep[b]-dep[a],k=0;
	while(len){
		if(len&1) a=lca[a][k];
		len=(len>>1),k++;
	}
	if(a==b) return a;
	for(long long i=30;i>=0;i--){
		if(lca[a][i]!=lca[b][i]){
			a=lca[a][i],b=lca[b][i];
		}
	}
	return lca[a][0];
}

long long ans;
void sjans(long long s,long long fa){
	for(long long i=head[s];i;i=edge[i].n){
		long long t=edge[i].t;
		if(t==fa) continue;
		sjans(t,s);
		C[s]+=C[t];
	}
	if(C[s]) ans+=power[s];
//	cout<<s<<" "<<C[s]<<" "<<power[s]<<" "<<ans<<" "<<"FGHJ"<<endl;
}

inline void read(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&dianpuan[i]);
	for(int i=1;i<=m;i++){
		long long f,t;
		scanf("%lld%lld",&f,&t);
		l_old++,edge_old[l_old]=(P){f,t,head_old[f]},head_old[f]=l_old;
		l_old++,edge_old[l_old]=(P){t,f,head_old[t]},head_old[t]=l_old;
	}
	tarjain(1,0);
	build();
	dep[belong[1]]=1;
	dfs(belong[1],0);
	scanf("%lld",&q);
	for(long long i=1;i<=q;i++){
		long long f,t;
		scanf("%lld%lld",&f,&t);
		C[belong[f]]++;
		C[belong[t]]++;
		long long c=getlca(belong[f],belong[t]);
//		cout<<c<<endl;
		C[c]--,C[lca[c][0]]--;
	}
	sjans(belong[1],0);
//	cout<<tot;
//	for(long long i=1;i<=n;i++) cout<<i<<" "<<belong[i]<<"KKK"<<endl;
//	for(long long i=1;i<=tot;i++) cout<<i<<" "<<power[i]<<"QQQ"<<endl;
//	for(long long i=1;i<=tot;i++) cout<<C[i]<<endl;
	printf("%lld",ans);
}

int main (){
	read();
}
2021/12/17 23:50
加载中...