洛谷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. go 结构体多字段多因素排序

    前言 有时候我们需要处理一份数据,需要多个字段作为条件,联合进行排序. 代码 package main import ( "fmt" "sort" ) // 数 ...

  2. IDEA 使用GIt提交代码时,如果不小心提交了不需要提交的内容,在本地仓库中,此时需要回滚版本,如何回滚

    选择上次提交的提交记录 选择上次提交的提交记录复制版本号 选中项目的Git重置器 填入刚复制的回滚版本号-点击Reset 这样一来就回滚回去了,本地提交就没了

  3. pagehelper的失效问题

    pagehelper是常用的分页插件,代码中常用到,使用简便且对代码侵入性较小,很多人都喜欢使用.不过有时会遇到分页失败问题,输出结果没有分页,日志输出sql语句没有分页关键字及分页参数,目测是pag ...

  4. Netty源码—8.编解码原理

    大纲 1.读数据入口 2.拆包原理 3.ByteToMessageDecoder解码步骤 4.解码器抽象的解码过程总结 5.Netty里常见的开箱即用的解码器 6.writeAndFlush()方法的 ...

  5. 【JDBC第1章】JDBC概述

    第1章:JDBC概述 1.1 数据的持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以 ...

  6. 主存的扩展及其与CPU的连接——字扩展

    一块芯片的容量为\(2^{18}B\),而该CPU需要的容量为:\(2^{地址总线位宽}\)=\(2^{21}B\),所以需要8片该芯片来扩展. 由于CPU由21个地址引脚,芯片只有18个地址引脚,C ...

  7. LeetCode1464. 数组中两元素的最大乘积-JAVA

    题目 给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值.请你计算并返回该式的最大值. 示例 1: 输入:nums = ...

  8. Altium designer21启动慢的解决方法

    安装altium designer21,启动非常慢,卡在starting GUI manager步骤,经搜索确认是卡在了网络等待环节. 解决办法: 1.先等待进入软件. 2.进入后点击右上角的⚙齿轮图 ...

  9. 使用Python解决氢原子问题

    引言 大家好!今天我们将讨论一个非常经典的物理问题-氢原子问题,并使用 Python 来进行求解.氢原子问题是量子力学中的基础问题,它帮助我们理解原子内部的电子结构及其能量水平.通过这篇文章,大家将学 ...

  10. Rocketmq 如何保证消息的可用性/可靠性/不丢失呢 ?

    如何保证消息的可用性/可靠性/不丢失呢 ? 消息可能在哪些阶段丢失呢?可能会在这三个阶段发生丢失:生产阶段.存储阶段.消费阶段 生产阶段 在生产阶段,主要通过请求确认机制,来保证消息的可靠传递 1.同 ...