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)
u为粉色∑w(u)−u为红色∑w(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;
}
思维要发散,敢于乱想