传送门

不会结论做个鬼系列

题意其实是在头尾(最多)两个栈以及中间一些双端队列依次取数,然后每个人都要最大化自己的价值

有一个结论,如果一段序列中,出现了三个相邻位置\(A,B,C\),满足\(A\le B\ge C\),那么可以把这三个数替换成\(A-B+C\).原因是假设先手某一次要取\(A\)(要取\(C\)同理),显然如果要取\(A\)说明此时\(A\)是最优决策废话,然后后手后面一定会取\(B\),因为先手的最优决策都是\(A\)而不是其他的,那么后手选\(B\)一定不差,不然先手为什么不选别的呢?同理,先手后面会取\(C\),如果不取\(C\)那他也不会白给后手一个\(B\)啊,所以这样取完三个数先手收益就是\(A-B+C\)

然后这样做完以后,所有栈/队列都会变成先递减然后递增的形式.对于队列,因为可以从两边取,那么每次只要取最大的就完事了,所以可以把所有队列元素放在一起排序,然后依次取;对于栈元素,从栈顶开始一直递减的那一段也是和队列一样的,但是递增的一段,显然先手一取,后手就会取下一个,导致先手亏,所以谁都不会先取,这一部分单独拎出来处理,即从栈底开始两两配对,把亏损的代价统计一下,然后放在最后面,看谁会取到

// luogu-judger-enable-o2
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<set>
#define LL long long
#define db double using namespace std;
const int N=1e6+10;
const LL inf=1ll<<50;
LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,m,p[N][2];
LL a[N],sm,dd,st[N],tp,b[N],tb; int main()
{
n=rd();
for(int i=1;i<=n;++i)
{
a[i]=rd();
sm+=a[i];
if(a[i])
{
if(!a[i-1]) p[++m][0]=i;
p[m][1]=i;
}
}
for(int i=1;i<=m;++i)
{
tp=0;
for(int j=p[i][0];j<=p[i][1];++j)
{
st[++tp]=a[j];
while(tp>=3&&st[tp-1]>=st[tp]&&st[tp-1]>=st[tp-2])
{
LL nw=st[tp]-st[tp-1]+st[tp-2];
--tp,--tp,--tp;
st[++tp]=nw;
}
}
if(i==1&&a[1])
{
int j=1;
for(;j+1<=tp&&st[j]>=st[j+1];) b[0]+=st[j+1]-st[j],++j,++j;
while(tp>=j) b[++tb]=st[tp--];
}
else if(i==m&&a[n])
{
for(int j=1;j<=tp/2;++j) swap(st[j],st[tp-j+1]);
int j=1;
for(;j+1<=tp&&st[j]>=st[j+1];) b[0]+=st[j+1]-st[j],++j,++j;
while(tp>=j) b[++tb]=st[tp--];
}
else
{
while(tp) b[++tb]=st[tp--];
}
}
sort(b+1,b+tb+1);
int ii=1;
while(~tb)
{
LL dt=b[tb--];
if(ii) dd+=dt;
else dd-=dt;
ii^=1;
}
printf("%lld %lld\n",(sm+dd)>>1,(sm-dd)>>1);
return 0;
}

luogu P3210 [HNOI2010]取石头游戏的更多相关文章

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

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

  2. 题解 洛谷 P3210 【[HNOI2010]取石头游戏】

    考虑到先手和后手都使用最优策略,所以可以像对抗搜索一样,设 \(val\) 为先手收益减去后手收益的值.那么先手想让 \(val\) 尽可能大,后手想让 \(val\) 尽可能小. 继续分析题目性质, ...

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

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

  4. [HNOI2010]STONE取石头游戏

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

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

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

  6. BZOJ.2000.[HNOI2010]stone取石头游戏(博弈)

    BZOJ 洛谷 低估这道神题了_(:з」∠)_ MilkyWay好狠啊(小声) \(Description\) 有一些数字,被分成若干双端队列(从两边都可以取)和最多两个栈(只能从某一边一个一个取)的 ...

  7. 【Luogu】P2599取石子游戏(博弈论)

    题目链接 情况非常复杂,事实上题解我现在也没有完全理解 不过大致的意思就是 设两个数组lef[][],rig[][]表示对应区间左端加一堆数量为lef[][]的石子使得先手必败,rig同理 可以通过一 ...

  8. luogu 4411 [BJWC2010]取数游戏 约数+dp

    不大难的dp,暴力拆一下约数然后按照约数来统计即可. 注意:vector 很慢,所以一定特判一下,如果没有该数,就不要添加. Code: #include <bits/stdc++.h> ...

  9. [LuoguP1005]矩阵取数游戏 (DP+高精度)

    题面 传送门:https://www.luogu.org/problemnew/show/P1005 Solution 我们可以先考虑贪心 我们每一次都选左右两边尽可能小的数,方便大的放在后面 听起来 ...

随机推荐

  1. 大哥带的JavaScript伪协议

    将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的 ...

  2. Spring boot之使用freemarker

    大纲 (1)在pom.xml中引入freemarker; (2)如何关闭freemarker缓存 (3)编写模板文件.ftl (4)编写访问文件的controller 在pom.xml中引入freem ...

  3. 网络1911、1912 C语言第1次作业批改总结

    一.评分规则 重点检查大家代码规范,变量名.大括号换行.缩进等发现不规范倒扣3分. 助教会进PTA查看大家代码的提交列表,发现不规范或抄袭,均扣分 每次作业完成后,至少邀请3个同学点评. 原作业地址: ...

  4. Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别

    谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能. ...

  5. ffmpeg剪切视频

    测试的时候需要用到视频,原片太大了,就剪切几分钟来测试 ffmpeg -i input.mp4 -ss 0 -t 300 -acodec copy -vcodec copy -scodec copy ...

  6. hive跑mapreduce报java.lang.RuntimeException: Error in configuring object

    写于2016.7月 最近项目需要在hbase上做统计分析,在本机上装了hive,结果跑小批量数据sum时报错: hive> select count(*) from page_view; Tot ...

  7. KNN原理小结

    K近邻法(K-nearest neighbors,KNN)既可以分类,也可以回归. KNN做回归和分类的区别在于最后预测时的决策方式.KNN做分类时,一般用多数表决法:KNN做回归时,一般用平均法. ...

  8. django中的model 的unique_together(联合唯一)

    unique_together解释 nique_together 这个元数据是非常重要的一个!它等同于数据库的联合约束! 举个例子,假设有一张用户表,保存有用户的姓名.出生日期.性别和籍贯等等信息.要 ...

  9. ArcGISDynamicMapServiceLayer 和 ArcGISTiledMapServiceLayer 区别

    ArcGISDynamicMapServiceLayer(动态地图服务)通常用于实时显示经常变化的数据,支持控制单个图层可见性,可动态投影.但缺点是显示效果较差,整个服务出图较慢:ArcGISTile ...

  10. web开发(二) Servlet中response、request乱码问题解决

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6412475.html>,在此仅供学习参考之用. 一.re ...