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;
}

转载于:https://www.cnblogs.com/SovietPower/p/10566210.html

BZOJ.2000.[HNOI2010]stone取石头游戏(博弈)相关推荐

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

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

  2. 【HNOI2010】【BZOJ2000】stone 取石头游戏

    BZOJ上的Source是骗子QAQ这题根本不是SG函数QAQ Description A 公司正在举办一个智力双人游戏比赛--取石子游戏,游戏的获胜者将会获得 A 公司提 供的丰厚奖金,因此吸引了来 ...

  3. BZOJ 1413: [ZJOI2009]取石子游戏 博弈+Dp

    title BZOJ 1413 Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行, ...

  4. 算法作业2-轮流取石头游戏

    两个足够聪明的人玩轮流取石头的游戏,谁取到最后一个石头谁就赢了,他们一次只能取1个.3个.7个或8个石头,写一程序判断n个石头时先取的人是输还是赢. 输入格式: 一个整数n,其值不超过10000000 ...

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

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

  6. poj 1067 取石子游戏(博弈+威佐夫博奕(Wythoff Game))

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29959   Accepted: 9818 Descriptio ...

  7. 取石头游戏 c语言,[HNOI2010]取石头游戏(博弈论+贪心)

    题目描述: 有\\(n\\)堆石子,每堆石子的个数为\\(a_i\\),保证存在至少一堆石子个数为\\(0\\) 两个人,每个人每次可以取一堆石子,一堆石子可以被取当且仅当它相邻的石子有至少一堆为\\ ...

  8. 小花梨的取石子游戏 ( 博弈 )

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/-萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗- ------------ ...

  9. bzoj 1413: [ZJOI2009]取石子游戏(博弈+DP)

    1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 711  Solved: 470 [Submit][Sta ...

最新文章

  1. Maven 的这 7 个问题你思考过没有?
  2. mvvm绑定checkbox wpf_C#框架结构分层:三层结构,DDD,MVC,MVVM,MVP
  3. 8.QT的事件循环与事件发送相关类
  4. FD_WRITE触发条件
  5. 图片怎么等比缩放_mac图像缩放工具Teorex iResizer
  6. 重载和引用函数编程实验
  7. springboot整合JWT使用
  8. IDEA 访问Maven私服与上传组件
  9. Farthest points Sampling on 3D meshes with mesh kept based on diffusion distance
  10. Nginx设置expires设定页面缓存时间
  11. 2.1.PHP7.1 狐教程-【PHP基础】
  12. 4种复制文件的方式性能比较
  13. 【软件工程】中国大学软件工程MOOC学习记录
  14. XRHT系列电钢琴实训室配置方案及清单
  15. 等级保护2.0三级通用要求测评方法
  16. 工资管理系统源码下载
  17. 微信小程序路线规划导航,选择起点和终点路线规划
  18. 20190131-JS - Promise使用详解--摘抄笔记
  19. 深入探究宽字节注入漏洞与修补原理
  20. Linux下根据用户ID查询用户名

热门文章

  1. 配置.net连接数据库的配置文件
  2. iOS开发,多个button数组,每个数组只能选中5项,多个数组只能选择3个。
  3. linux扫盲之CPU模式
  4. tc35 终端 cnmi=2,2即时模式下收不到短信的问题
  5. JavaScript NaN 属性
  6. 网站链接自动化测试原理及工具介绍
  7. 动作定位、检测与理解,ICCV 2021 DeeperAction挑战赛开启~
  8. 读书节来当当薅羊毛!170买400/240买600
  9. 专研自动驾驶,深动科技春季招聘启动,含社招和实习
  10. 3D视觉公开课 | TOF系统设计与分析