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

题目链接:洛谷


这道题乍一看非常的难,而且题目标题上的标签让人很害怕。

但其实这道题并不难写(只要想到了。。。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\n", ans >> 1);
21 }
Luogu4643

 

转载于:https://www.cnblogs.com/AThousandMoons/p/10718978.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值