BZOJ

洛谷

低估这道神题了_(:з」∠)_

MilkyWay好狠啊(小声)


\(Description\)

有一些数字,被分成若干双端队列(从两边都可以取)和最多两个栈(只能从某一边一个一个取)的形式。两人轮流取这些数字,每个人都想最大化自己取到的数字和,求最后两人各能取到多少。

\(n\leq10^6\)。

\(Solution\)

对于最左边的栈,如果有\(A_1\geq A_2\),那么先手取了\(A_2\),后手一定会取走\(A_1\)(如果赚,显然后手要取;如果不赚,先手可以取别的最后依旧让后手取走)。同样扩展到左边连续递减的一段,两人都是轮流取的(这样\(i\)为奇数时,后手取\(A_{i-1}\)可能就不赚了)。

最右边的栈同理。

然后能发现,谁能取到最左和最右边的数只与数字总个数有关,如果一共奇数个,先手可以同时取走最左和最右,否则后手可以。(nb...感觉真要证会很复杂)

那么我们就可以处理完左右递减的那一段了。剩下的等会再说。

考虑双端队列,如果有\(A_{i-1}\leq A_i\geq A_{i+1}\),且先手取走\(A_{i-1}\),那么后手一定去取\(A_i\),先手一定会取走\(A_{i+1}\),所以收益差是固定的,为\(A_i-A_{i-1}-A_{i+1}\)。这里的先手是指取\(A_{i-1}\)的人。那么我们就可以将这三个数压成一个数,去求收益差。

那么我们就可以将这种上凸的情况全合并掉,把序列变成只有递减的、递增的、下凸的三种情况,显然这三种一定是从大到小轮流选的。

这样合并两个栈,因为左边递减的已经合并了,也没有上凸情况了,所以只剩下递增情况了。同样和双端队列那些放一起轮流选就行了。

最后求出个差,知道总数就知道答案了。

注意合并后的元素是可能出现\(0\)的,空位置要再开个数组判。


//17916kb	368ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <functional>
#define gc() getchar()
#define MAXIN 500000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e6+5; LL sk[N],A[N];
bool tag[N];
char IN[MAXIN],*SS=IN,*TT=IN; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
} int main()
{
int n=read(),top=0,sta=0;
LL sum=0,ans=0;
for(int i=1; i<=n; ++i)
{
sk[++top]=read();
tag[top]=(sk[top]>0), sta^=(sk[top]>0), sum+=sk[top];
while(top>2 && tag[top] && tag[top-1] && tag[top-2] && sk[top-1]>=std::max(sk[top-2],sk[top]))
sk[top-2]=sk[top]+sk[top-2]-sk[top-1], top-=2;
}
int l=1,r=top,cnt=0,v=sta?1:-1;
for(; tag[l]&&tag[l+1]&&sk[l]>=sk[l+1]; l+=2) ans+=v*(sk[l]-sk[l+1]);
for(; tag[r]&&tag[r-1]&&sk[r]>=sk[r-1]; r-=2) ans+=v*(sk[r]-sk[r-1]);
for(int i=l; i<=r; ++i) tag[i]&&(A[++cnt]=sk[i]);
std::sort(A+1,A+1+cnt,std::greater<LL>());
for(int i=1; i<=cnt; ++i) i&1?ans+=A[i]:ans-=A[i];
printf("%lld %lld\n",sum+ans>>1,sum-ans>>1); return 0;
}

BZOJ.2000.[HNOI2010]stone取石头游戏(博弈)的更多相关文章

  1. bzoj2000 [Hnoi2010]stone 取石头游戏

    Description A 公司正在举办一个智力双人游戏比赛----取石子游戏,游戏的获胜者将会获得 A 公司提供的丰厚奖金,因此吸引了来自全国各地的许多聪明的选手前来参加比赛. 与经典的取石子游戏相 ...

  2. [HNOI2010]STONE取石头游戏

    题目描述 A 公司正在举办一个智力双人游戏比赛----取石子游戏,游戏的获胜者将会获得 A 公司提供的丰厚奖金,因此吸引了来自全国各地的许多聪明的选手前来参加比赛. 与经典的取石子游戏相比,A公司举办 ...

  3. [luogu] P3210 [HNOI2010]取石头游戏(贪心)

    P3210 [HNOI2010]取石头游戏 题目描述 A 公司正在举办一个智力双人游戏比赛----取石子游戏,游戏的获胜者将会获得 A 公司提供的丰厚奖金,因此吸引了来自全国各地的许多聪明的选手前来参 ...

  4. 【BZOJ2000】[HNOI2000]取石头游戏(贪心,博弈论)

    [BZOJ2000][HNOI2000]取石头游戏(贪心,博弈论) 题面 BZOJ 洛谷 题解 这题好神仙啊,窝不会QaQ. 假装一下只有三个元素\(a_{i-1},a_i,a_{i+1}\),并且满 ...

  5. 计蒜客 取数游戏 博弈+dp

    题目链接 取数游戏 思路:dp(x, y)表示先手在区间[x, y]能取得的最大分数.当先手取完,就轮到后手去,后手一定会选择当前能令他得到最大分数的策略,其实当先手在[x, y]区间两端取走一个数, ...

  6. hdu 2516 取石子游戏 (博弈)

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]

    小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问你他是否有必胜策略,如 ...

  8. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 871  Solved: 365[Submit][Status][Discuss] Description ...

  9. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏

    Time Limit: 5 Sec Memory Limit: 162 MB Submit: 957 Solved: 394 [Submit][Status][Discuss] Description ...

随机推荐

  1. CF 1042F

    玄学贪心... 题意:给出一棵树,要求将他的所有叶节点分成最少的组,且在每组中的任意两节点之间的距离不大于k 解析: 显然是个贪心啦... 稍微考虑一下贪心思想: 我们从下向上合并整棵树,在合并到某个 ...

  2. Sequence Number

    1570: Sequence Number 时间限制: 1 Sec  内存限制: 1280 MB 题目描述 In Linear algebra, we have learned the definit ...

  3. python接口自动化测试三十三:获取时间戳(10位和13位)

    很多时候,在调用接口时,需要对请求进行签名.需要用到unix时间戳. 在python里,在网上介绍的很多方法,得到的时间戳是10位.而java里默认是13位(milliseconds,毫秒级的). 下 ...

  4. centos7.5上一步步部署jumpserver

    1.基础环境:centos7.5:关闭防火墙和selinux 2.修改字符集,否则可能会报input/output error 的问题,因为日志里打印了中文 [root@xzw ~]# localed ...

  5. AI学习吧-登录注册

    登录注册注销 如果需要给表设置权限,没有登录就不可以查看,只需要在每个视图函数之前加上Auth_classes=[ ]即可! 增加两张表,做登录认证 #models.py #做登录验证 class U ...

  6. 向github上提交自己的project

    参考博客:https://blog.csdn.net/m0_37725003/article/details/80904824 step I: 创建自己的github账户(username:fourm ...

  7. js基本类型和字符串的具体应用

    变量 JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定. 定义变量需要用关键字 'var' var a = 123; var b = 'asd'; //同时定义多个 ...

  8. HDU 1671 Phone List (qsort字符串排序与strncmp的使用 /字典树)

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. 16位和32位的80X86汇编语言的区别

    需要注意的是汇编不是一种语言,不同平台有不同的汇编语言对应,因为汇编和操作系统平台相关,所以汇编语言没有移植性.对于IA-32架构平台而言,选用的32位80386汇编语言,也就只说讨论的操作系统平台是 ...

  10. MyBatis - 10.MyBatis扩展

    1.PageHelpler分页插件使用 官方文档:中文 1.1 引入插件 1.1.1 引入的jar pagehelper-5.1.6.jar jsqlparser-1.2.jar 1.1.2 mave ...