bzoj 2563: 阿狸和桃子的游戏 贪心
这个真的好巧妙啊~
如果只考虑点权的话显然直接按照权值大小排序即可.
但是加入了边权,就有了一个决策的问题.
于是,我们将边权分一半,分给两个端点.
如果一个人拿了两个端点,则边权都会加上.
否则,边权会抵消.
直接按照点权+一半边权排序即可.
code:
#include <bits/stdc++.h> #define N 100004 #define LL long long using namespace std; void setIO(string s) { string in=s+".in"; freopen(in.c_str(),"r",stdin); } LL a[N]; int main() { // setIO("input"); int n,m,i,j; scanf("%d%d",&n,&m); for(i=1;i<=n;++i) scanf("%lld",&a[i]),a[i]<<=1; for(i=1;i<=m;++i) { int x,y; LL z; scanf("%d%d%lld",&x,&y,&z); a[x]+=z,a[y]+=z; } sort(a+1,a+1+n); LL ans=0ll; for(i=1;i<n;i+=2) { ans+=a[i+1]-a[i]; } printf("%lld\n",ans/2); return 0; }