bzoj2563(脑洞题)

来源:互联网 发布:解压软件怎么用 编辑:程序博客网 时间:2024/06/06 12:32

题目大意:给定一张无向图,每个点有点权,每条边有边权,两个人轮流选择点,若一条边的两端点被选择则这条边被选择,两人都想自己的得分-对手的得分最大,求最终先手得分-后手得分

这题有一个性质,一条边要么是两端点同属于一个人,要么是属于2个人,那么把这条边权平分给两个端点,又因为要求的是差值,所以这么做是没有问题的。那么把分权后的点排序扫一遍就可以了。



#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;int n,m;int val[100005];bool cmp(int a,int b) {return a>b;}int main(){scanf("%d%d",&n,&m);int x,y,v;for (int i=1;i<=n;i++) scanf("%d",&val[i]),val[i]<<=1;for (int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&v);val[x]+=v;val[y]+=v;}sort(val+1,val+n+1,cmp);int b[2];b[0]=b[1]=0;for (int i=1;i<=n;i++) b[i&1]+=val[i];printf("%d",(b[1]-b[0])>>1);return 0;}

总结

1:对于有一些需要将给出信息除以2来处理的题目,如果担心整除所带来的影响,可以考虑将所有的信息乘2,最后答案再处于2就好,以此减小误差。



0 0