洛谷P4643 [国家集训队]阿狸和桃子的游戏

引入

其实是道小水题,没有那么多的数据结构和卡常。但是我就是喜欢这种题!giao!

(希望这道题不要变色啊……这可是我a的第一道黑题啊啊啊……

蒟蒻的心情激动不已啊

原题传送门

题目描述

阿狸和桃子正在玩一个游戏,游戏是在一个带权图G=(V, E)上进行的,设节点权值为w(v),边权为c(e)。游戏规则是这样的:

  1. 阿狸和桃子轮流将图中的顶点染色,阿狸会将顶点染成红色,桃子会将顶点染成粉色。已经被染过色的点不能再染了,而且每一轮都必须给一个且仅一个顶点染色。

  2. 为了保证公平性,节点的个数N为偶数。

  3. 经过N/2轮游戏之后,两人都得到了一个顶点集合。对于顶点集合S,得分计算方式为

\sum_{v \in S}w(v) + \sum_{e=(u,v)\in E \land u,v\in S}c(e)v∈S∑​w(v)+e=(u,v)∈E∧u,v∈S∑​c(e)

由于阿狸石头剪子布输给了桃子,所以桃子先染色。两人都想要使自己的分数比对方多,且多得越多越好。如果两人都是采用最优策略的,求最终桃子的分数减去阿狸的分数。

输入格式

输入第一行包含两个正整数N和M,分别表示图G的节点数和边数,保证N一定是偶数。

接下来N+M行。

前N行,每行一个整数w,其中第k行为节点k的权值。

后M行,每行三个用空格隔开的整数a b c,表示一条连接节点a和节点b的边,权值为c。

输出格式

输出仅包含一个整数,为桃子的得分减去阿狸的得分。

输入输出样例

输入 #1复制

4 4
6
4
-1
-2
1 2 1
2 3 6
3 4 3
1 4 5
输出 #1复制

3

说明/提示

数据规模和约定

对于40%的数据,1 ≤ N ≤ 16。

对于100%的数据,1 ≤ N ≤ 10000,1 ≤ M ≤ 100000,-10000 ≤ w , c ≤ 10000。


Solution

先理解那个式子——

两个人依次选点

而最终的得分等于

选的点数的和

再加上其选的每两点之间的直接的边之和

即:一条边仅当它所连接的两个点都被同一个人所选,这条边的w才归这个人所有。

边和点都对答案有所影响,怎么办呢?要是只有点权就好了啊!

欸……那能不能把边权转化为点权呢?可以的!把边权对半分给边就好了!

我们从一张图中扣下来一条边,仔细分析一下:

如图,A和B是点(权),C是边(权)。

如果直接使用上面的性质我们可以分类讨论一下:

下面分4中情况

  1. 桃子把A和B都染成了粉色,那么桃子得到了这ABC的权ans=(A+C/2)+(B+C/2)=A+B+C;
  2. 桃子把A染成了粉色,阿狸把B染成了红色,那么得分为(A+C/2)-(B+C/2)=A-B;
  3. 桃子把B染成了粉色,阿狸把B染成了红色,那么得分为(B+C/2)-(A+C/2)=B-A;
  4. 阿狸把A和B都染成了红色,那么得分为-(A+C/2)-(B+C/2)=-(A+B+C);

发现这和暴力加是一样的!

所以,只要把边权平分到两个点上再进行排序,奇数偶数分配即可!

Code

 1 #include<iostream>
2 #include<algorithm>
3 #include<cstdio>
4 #include<cstring>
5 #include<cmath>
6 #include<map>
7 #include<set>
8 #include<queue>
9 #include<vector>
10 #define IL inline
11 #define re register
12 #define LL long long
13 #define ULL unsigned long long
14 #define re register
15 using namespace std;
16
17 template<class T>inline void read(T&x)
18
19 {
20 char ch=getchar();
21 while(!isdigit(ch))ch=getchar();
22 x=ch-'0';ch=getchar();
23 while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
24 }
25 inline int read()
26 {
27 int x=0;
28 char ch=getchar();
29 while(!isdigit(ch))ch=getchar();
30 x=ch-'0';ch=getchar();
31 while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
32 return x;
33 }
34 int G[55];
35 template<class T>inline void write(T x)
36 {
37 int g=0;
38 do{G[++g]=x%10;x/=10;}while(x);
39 for(re int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
40 }
41 int n,m;
42 double ans,a[10010];
43 bool cmp(const double & a,const double & b){
44 return a>b;
45 }
46 int main()
47 {
48 cin>>n>>m;
49 for(int i=1;i<=n;i++) cin>>a[i];
50 for(int i=1,x,y;i<=m;i++)
51 {
52 double z;
53 cin>>x>>y>>z;
54 a[x]+=z/2;
55 a[y]+=z/2;
56 }
57 sort(a+1,a+n+1,cmp);
58 for(int i=1;i<=n;i++) if(i&1) ans+=a[i];else ans-=a[i];
59 cout<<ans;
60 return 0;
61 }

小结

心情不错,今天上午考完了初赛,估分77.5……希望能进复赛,当然,要是AFO的话……那就AFO吧……就当作是场错付吧……

(要是不会真的 “考完初赛回来A了一道黑题,结果发现今年AFO了”吧?)呸呸呸,乌鸦嘴

OVER

洛谷P4643 [国家集训队]阿狸和桃子的游戏 & 初赛心情的更多相关文章

  1. 洛谷P4643 [国家集训队]阿狸和桃子的游戏(思维题+贪心)

    思维题,好题 把每条边的边权平分到这条边的两个顶点上,之后就是个sb贪心了 正确性证明: 如果一条边的两个顶点被一个人选了,一整条边的贡献就凑齐了 如果分别被两个人选了,一作差就抵消了,相当于谁都没有 ...

  2. P4643 [国家集训队]阿狸和桃子的游戏

    传送门 这题看一眼就很不可做 考虑对于任意一个最终状态,对于一条边的贡献分成三种情况 如果此边连接的两点属于 $A$,那么对 $A$ 的贡献就是边权 $w$,即对答案的贡献为 $+w$ 如果两点都属于 ...

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

    题目链接:洛谷 这道题乍一看非常的难,而且题目标题上的标签让人很害怕. 但其实这道题并不难写(只要想到了...emm) 因为我们只需要知道两个人得分之差,所以我们可以对条件进行变换. 我们将边权平分到 ...

  4. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  5. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

  6. 洛谷P1501 [国家集训队]Tree II(LCT,Splay)

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

  7. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  8. 洛谷 P1407 [国家集训队]稳定婚姻 解题报告

    P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...

  9. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

  10. 洛谷 P1501 [国家集训队]Tree II 解题报告

    P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...

随机推荐

  1. coco数据集详解

    什么是COCO数据集? MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集,与ImageN ...

  2. 「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)

      为了让学习的知识融汇贯通,目前是把所有的集群都放在了一个虚拟机上,如果这个虚拟机宕机了怎么办?俗话说鸡蛋不要都放在一个篮子里面,把各种集群的节点拆分部署,应该把各种节点分机器部署,多个宿主机,这样 ...

  3. 查看nginx版本号的几种方法

    1. 查看服务器上安装的nginx版本号,主要是通过nginx的-v或-V选项,查看方法如下图所示      -v 显示 nginx 的版本.      -V 显示 nginx 的版本,编译器版本和配 ...

  4. 深入理解 Java AQS 原理与 ReentrantLock 实现

    目录 一.AQS 简介 二.AQS 核心设计 2.1 核心组成部分 2.2 AQS 的工作原理 2.3 AQS 的关键方法 三.ReentrantLock 与 AQS 的关系 3.1 Reentran ...

  5. $.ajax jsonp parsererror

    场景重现 通过$.ajax()发起的跨越请求代码如下: $.ajax({ dataType: "JSONP", type: "GET", url: " ...

  6. RuoYi-vue配置记录

    如果这个项目能顺利运行,标志着Springboot+vue的前后端环境都配好了. 一.官方文档 若依官方文档:介绍 | RuoYi,在这个地方克隆/下载项目源代码https://gitee.com/y ...

  7. MQTT消息传递过程中,序列化协议如何选择?文本序列化还是二进制序列化协议。

    字符串消息的序列化 在上一篇文章中,我们使用MQTTnet 框架,实现了一个MQTT服务器.MQTT发布者进程.MQTT订阅者进程.在消息传递过程中,我们将控制台的字符串直接传递.因为MQTT是应用层 ...

  8. Asp.net mvc基础(十三)集合常用的扩展方法和Linq语句

    详情参考:C#之集合常用扩展方法与Linq - 冯继强fjq - 博客园 (cnblogs.com)

  9. thinkphphp 计算分页 和分页总数 和sql计算分页 php

    利用page计算分页 $p=input('p')?input('p'):1; $limit=6; $res=db('points_log')->where(['p_uid'=>$uid,' ...

  10. 正点原子ALPHA开发板使用4.3寸触摸屏LCD驱动实验显示不正常

    显示问题 裸机开发时,驱动教程的PDF里给了4.3寸LCD屏幕的设置参数.如下图所示: 但是按照这个设置,编写设备树dts文件,下载到开发板里,却出现了显示异常,具体来说就是帧率不对,图和字都是歪斜的 ...