萌新求助
查看原帖
萌新求助
174897
zjrdmd楼主2020/9/14 20:56

Rt,调了好久了qwq,看了n遍代码也没看出来哪里错了/kk

WA在了第五个点。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stdlib.h>
#include <stack>
#include <queue>
#define ri register int
#define int long long

inline int read() {
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}

const int N=1e6+5,inf=1e9+7;

int T,n,m;
int to[N<<1],next[N<<1],head[N],val[N],cnt=1,tot=0;
int p[N],siz[N],son[N<<1],f[N<<1],ans=0;

bool cmp(int x,int y){
	return x>y;
}

void edge_add(int u,int v){
	to[cnt]=v;
	next[cnt]=head[u];
	head[u]=cnt++;
}

void Read(){
	n=read();
	for(ri i=1;i<n;i++){
		int u=read(),v=read();
		edge_add(u,v),edge_add(v,u);
	}
	m=read();
	for(ri i=1;i<=m;i++)p[i]=read();
	std::sort(p+1,p+m+1,cmp); 
}

void dfs(int now,int fa){
	siz[now]=1;
	for(ri i=head[now];i;i=next[i]){
		int v=to[i];
		if(v==fa)continue;
		son[i]=v;
		dfs(v,now);
		siz[now]+=siz[v];
	}
}

void work(){
	for(ri i=1;i<=(n<<1);i++){
		if(son[i]==0)continue; 
		val[++tot]=siz[son[i]]%inf*(n-siz[son[i]])%inf;
	}
//	printf("%d\n",tot);
//	for(ri i=1;i<n;i++)printf("%d ",val[i]);
//	printf("\n");
	std::sort(val+1,val+tot+1,cmp);
	int ls=1,pp=1;n-=1;
	if(n>=m)pp=1;
	else {
		int ls=1;
		for(ri i=1;i<=m-n+1;i++)ls*=p[i],pp++,ls%=inf;
		p[pp-1]=ls;
		pp-=1;
	}
	for(ri i=1;i<=n;i++){
		if(pp<=m)ans+=val[i]%inf*p[pp]%inf;
		else ans+=val[i];
//		printf("%d %d %d\n",val[i],p[pp],pp);
		ans%=inf;
		pp++;
	}
	printf("%lld\n",ans);
	n+=1;
}

void clear(){
	for(ri i=1;i<=(n<<1);i++)to[i]=0,next[i]=0,son[i]=0,f[i]=0;
	for(ri i=1;i<=(n<<1);i++)head[i]=0,siz[i]=0,val[i]=0,p[i]=0;
	cnt=1,ans=0,tot=0;
}

signed main(void){
	T=read();
	while(T--){
		Read();
		dfs(1,0); 
		work();
		clear();
	}
	return 0;
}

2020/9/14 20:56
加载中...