您的位置:首页 > 其它

【BZOJ 2563】 阿狸和桃子的游戏 脑洞+贪心

2017-01-06 18:38 411 查看
一个不错的题目。因为是求两人得分的差值,所以我们将边权对半分,分别加在所连接的两点上,这样如果两边是不同的人拿的话,相减就等于没有拿,而如果是相同的人拿,就相当于拿全了,但是为了避免浮点数,所以采用点权乘二,最后答案/2

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 100020
#define LL long long
using namespace std;
LL val[maxn],n,m;

bool cmp(const LL& a,const LL& b){return a>b;}

int main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",val+i),val[i]*=2;
LL a,b,c;
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&a,&b,&c);
val[a]+=c,val[b]+=c;
}
sort(val+1,val+1+n,cmp);LL ans=0;
for(int i=1;i<=n;i++){
if(i&1)ans+=val[i];
else ans-=val[i];
}
printf("%lld",ans/2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: