luogu P4643 [国家集训队]阿狸和桃子的游戏

https://www.luogu.com.cn/problem/P4643
打比赛签到题是这题的加强版,完全不会,人傻了
w ( u ) w(u) w(u)表示和u点相连的边权之和加上自身的点权
可以发现答案求的就是 ∑ u 为 粉 色 w ( u ) − ∑ u 为 红 色 w ( u ) \sum\limits_{u为粉色}w(u) - \sum\limits_{u为红色} w(u) uw(u)uw(u),然后边权被算了两次
发现如果一条边两端颜色不同,刚好可以被抵消,如果颜色相同,边权就会被算两次
所以具体处理的时候可以先把点权两倍,轮流贪心取 w w w最大的,最后再除2
code:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n, m, a[N];
int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i ++) scanf("%d", &a[i]), a[i] <<= 1;
	for(int i = 1; i <= m; i ++) {
		int u, v, c;
		scanf("%d%d%d", &u, &v, &c);
		a[u] += c, a[v] += c;
	}
	sort(a + 1, a + 1 + n);
	long long ans = 0;
	for(int i = 1; i <= n; i ++) 
		ans += (i & 1)? -a[i] : a[i];
	printf("%lld", ans >> 1);
	return 0;
}

思维要发散,敢于乱想

posted @ 2021-04-01 09:04  lahlah  阅读(31)  评论(0编辑  收藏  举报