萌新刚学OI,求助
查看原帖
萌新刚学OI,求助
145078
RainsAFO楼主2020/8/22 22:32
#include <bits/stdc++.h>

#define int long long

using namespace std;

int n , m , ans;

const int N = 2e5 + 5;
const int mod = 1e9 + 7;

struct node {
	int to , next;
} e[N << 1];

int head[N << 1] , cnt = 0;

int siz[N] , val[N];

vector <int> p;
vector <int> q;

void add(int x , int y , int z = 1) {
	e[++cnt].next = head[x];
	e[cnt].to = y;
	head[x] = cnt;
	if(z)
		add(y , x , 0);
}

void dfs(int u , int fa) {
	siz[u] = 1;
	for(int i = head[u]; i; i = e[i].next) {
		int v = e[i].to;
		if(v == fa)
			continue;
		dfs(v , u);
		siz[u] += siz[v];
		val[v] = siz[v] * (n - siz[v]);
	}
}

inline void clear() {
	cnt = 0;
	ans = 0;
	memset(siz , 0 , sizeof(siz));
	memset(val , 0 , sizeof(val));
	memset(head , 0 , sizeof(head));
	p.clear();
	q.clear();
}

main() {
	int T;
	cin >> T;
	while(T--) {
		clear();
		cin >> n;
		for(int i = 1; i < n; i++) {
			int u , v;
			cin >> u >> v;
			add(u , v);
		}
		dfs(1 , 0);
		cin >> m;
		for(int i = 1; i <= m; i++) {
			int x;
			cin >> x;
			p.push_back(x);
		}
		for(int i = 2; i <= n; i++)
			q.push_back(val[i]);

		if(m <= n - 1) {
			for(int i = m + 1; i < n; i++)
				p.push_back(1);
			sort(p.begin() , p.end());
		} else {
			int mul = 1;
			sort(p.begin() , p.end());
			for(int i = n - 1; i <= m; i++)
				mul = (mul * p[i - 1]) % mod;
			p[n - 2] = mul;
			p.erase(p.begin() + n - 1 , p.end());
		}
		sort(p.begin() , p.end());
		sort(q.begin() , q.end());
		for(int i = 0; i < n - 1; i++)
			ans = (ans + p[i] % mod * q[i] % mod) % mod;
		cout << ans << endl;
	}
}

rt,思路是处理每条边经过的次数,贪心的取较优的因子,根据排序不等式统计答案,WA on #46

请问是这个做法有问题还是我写错了

2020/8/22 22:32
加载中...