题目链接:洛谷
这道题乍一看非常的难,而且题目标题上的标签让人很害怕。
但其实这道题并不难写(只要想到了。。。emm)
因为我们只需要知道两个人得分之差,所以我们可以对条件进行变换。
我们将边权平分到边两端的节点,取到了一个点也相当于取到了点权加上一半的边权,则发现对于边$(u,v)$有以下四种情况:
1.桃子取到了$u$和$v$,这时这两点的贡献为$w(u)+w(v)+c(u,v)/2+c(u,v)/2=w(u)+w(v)+c(u,v)$,与原来相同。
2.桃子取到了$u$,阿狸取到了$v$,贡献为$w(u)-w(v)+c(u,v)/2-c(u,v)/2=w(u)-w(v)$,与原来相同。
对于另外两种情况是一样的。
所以对于新的点权,我们每次贪心地取当前能取的最大的点权,这个就是答案了。
为了避免出现小数,我们可以对点权$*2$,最后把答案$/2$
1 #include<bits/stdc++.h> 2 #define Rint register int 3 using namespace std; 4 const int N = 10003; 5 int n, m, a[N], ans; 6 int main(){ 7 scanf("%d%d", &n, &m); 8 for(Rint i = 1;i <= n;i ++){ 9 scanf("%d", a + i); 10 a[i] <<= 1; 11 } 12 for(Rint i = 1;i <= m;i ++){ 13 int x, y, z; 14 scanf("%d%d%d", &x, &y, &z); 15 a[x] += z; a[y] += z; 16 } 17 sort(a + 1, a + n + 1); 18 for(Rint i = 1;i < n;i += 2) 19 ans += a[i + 1] - a[i]; 20 printf("%d ", ans >> 1); 21 }