原文链接www.cnblogs.com/zhouzhendong/AGC026F.html

前言

太久没有发博客了,前来水一发。

题解

不妨设先手是 A,后手是 B。定义 \(i\) 为奇数时,\(a_i\) 为"奇数位上的数";\(i\) 为偶数时, \(a_i\) 为"偶数位上的数"。定义左、右两端的数分别表示 \(a_1\) 和 \(a_n\)。

考虑第一步:

首先,如果 A 取了左右某一个端点,那么他必然能取走和他取的点奇偶性相同的所有点。

然后,我们考虑 A 取了一个中间点后会发生什么:如果这个点左边和右边的剩余点数都是奇数,那么无论 B 取左还是右,取完某一边之后,问题规模缩小成另一边的情况,A 一定还是先手;否则 B 就可以取剩余点数为偶数的那一边,并成为先手。

考虑 n 为偶数的情况。

如果 A 取了一个中间点,那么一定有一边剩余奇数个,一边剩余偶数个。那么 B 一定先操作偶数个的那一边,然后获得奇数那一边的先手权,然后取最优策略。那么 A 还不如直接取偶数那一边的端点,这样做不仅取到了前一种方案能取到的,而且让 B 在另一边没有了先手选择权,一定不劣于前一种方案。

所以,当 n 为偶数时,先手能取到的最大值为 max(奇数位之和, 偶数位之和) 。

n 为奇数的情况较为复杂。

但是同理,A 不会去取一个位于奇数位的数,这样会导致两边剩余个数都为偶数,不如直接取两端。

于是,n 为奇数时,A 只有两种策略:

  • 取端点,即拿走所有奇数位的数。
  • 取某一个偶数位的数。此时,如果 B 取左边,那么 A 会继续获得右边的先手权;否则 A 获得左边的先手权。这个过程可以看作问题规模的缩小。

如果将第二种策略用二叉树的形式表示出来,那么 B 一定会选择某一个叶子,使得最终答案最小。

考虑先假设所有偶数位的贡献都已被 A 收取,那么 A 在一个区间执行“取端点”操作得到的收益就是这个区间的奇数位之和减去偶数位之和(注意这里的两端点一定都是奇数)。

我们要做的是找出一个叶子集合,使得对这些叶子“取端点”的收益的最小值尽量大。

考虑二分答案x,之后问题转化为是否可以删除某些偶数位上的数,使得剩下的序列中任意一个极大的连续段之和都不小于x。

考虑暴力DP,枚举右端点,然后再暴力枚举前一个划分点。时间复杂度不可接受。

由于DP信息只有“能”和“不能”,所以我们可以考虑贪心,只保留“能”的点中前缀和最小的即可。

时间复杂度 \(O(n\log \sum a_i)\)。

代码

#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof x)
#define For(i,a,b) for (int i=(a);i<=(b);i++)
#define Fod(i,b,a) for (int i=(b);i>=(a);i--)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define fi first
#define se second
#define outval(x) cerr<<#x" = "<<x<<endl
#define outtag(x) cerr<<"-----------------"#x"-----------------\n"
#define outarr(a,L,R) cerr<<#a"["<<L<<".."<<R<<"] = ";\For(_x,L,R) cerr<<a[_x]<<" ";cerr<<endl;
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
LL read(){LL x=0,f=0;char ch=getchar();while (!isdigit(ch))f=ch=='-',ch=getchar();while (isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return f?-x:x;
}
const int N=300005;
int n;
int a[N],s[N];
bool check(int x){int v=0;for (int i=1;i<n;i+=2)if (s[i]-v>=x)v=min(v,s[i+1]);return s[n]-v>=x;
}
int main(){n=read();For(i,1,n)a[i]=read();if (n%2==0){int s0=0,s1=0;For(i,1,n)if (i&1)s0+=a[i];elses1+=a[i];cout<<max(s0,s1)<<" "<<min(s0,s1)<<endl;return 0;}For(i,1,n)if (i&1)s[i]=s[i-1]+a[i];elses[i]=s[i-1]-a[i];int L=1,R=n*1000,mid,ans=L;while (L<=R){mid=(L+R)>>1;if (check(mid))L=mid+1,ans=mid;elseR=mid-1;}For(i,1,n)if (i%2==0)ans+=a[i];int s=0;For(i,1,n)s+=a[i];cout<<ans<<" "<<s-ans<<endl;return 0;
}

转载于:https://www.cnblogs.com/zhouzhendong/p/AGC026F.html

Atcoder Grand Contest 026 (AGC026) F - Manju Game 博弈,动态规划相关推荐

  1. AtCoder Grand Contest 002 (AGC002) F - Leftmost Ball 动态规划 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC002F.html 题目传送门 - AGC002F 题意 给定 $n,k$ ,表示有 $n\times k$ ...

  2. AtCoder Grand Contest #026 D - Histogram Coloring

    Time Limit: 2 sec / Memory Limit: 1024 MB Score : 11001100 points Problem Statement Let us consider ...

  3. 【每日亿题#12】AtCoder Grand Contest 021 (A ~ F)全部题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 AtCoder Grand Contest 021 题解 A. Digit Sum 2 B. ...

  4. AtCoder Grand Contest 017

    AtCoder Grand Contest 017 A - Biscuits 有\(n\)个数,问有多少个集合的数的和模\(2\)余\(P\). 随便\(dp\)一下就好了. #include< ...

  5. AtCoder Grand Contest 008: Contiguous Repainting(思维)

    Contiguous Repainting 时间限制: 2 Sec  内存限制: 256 MB 提交: 69  解决: 22 [提交][状态][讨论版][命题人:admin] 题目描述 There a ...

  6. AtCoder题解——AtCoder Grand Contest 048——A - atcoder < S

    题目相关 题目链接 AtCoder Grand Contest 048 A 题,https://atcoder.jp/contests/agc048/tasks/agc048_a. Problem S ...

  7. AtCoder题解 —— AtCoder Grand Contest 050 —— B - Three Coins —— 动态规划

    题目相关 题目链接 AtCoder Grand Contest 050 B 题,https://atcoder.jp/contests/agc050/tasks/agc050_b. Problem S ...

  8. [AtCoder Grand Contest 048] D - Pocky Game(区间dp + 博弈)

    problem AtCoder solution 注意:本题不是平等博弈,因为先手只能取最左边,后手只能取最右边. 设 f[l][r][k]:f[l][r][k]:f[l][r][k]: 只剩下区间 ...

  9. (组合数学)AtCoder Grand Contest 019 F - Yes or No

    F - Yes or No Time limit時間制限 : 2sec / Memory limitメモリ制限 : 256MB 配点 : 2000 点 問題文 あなたは N+M 問のマルバツクイズが出 ...

最新文章

  1. python 模拟微信浏览器请求_使用Chrome修改user agent模拟微信内置浏览器
  2. 关闭 Adobe Flash 沙箱(保护模式)解决Flash崩溃及卡顿问题
  3. C#计算两个时间的差
  4. jetty java 文件下载_Jetty 嵌入式开发之文件浏览和文件下载
  5. 商品进销差价_商品进销差价如何核算?
  6. 智慧、智能图书馆管理平台系统+web端业务数据管理平台+Axure通用web端高保真交互业务数据管理平台+铭牌管理+设备监控+系统管理+内容管理+机构列表管理+用户权限管理+专题管理+服务包管理
  7. Bailian4036 计算系数【数学+迭代】
  8. 检测到无效的异常处理程序例程。_异常控制流(1):异常概述和基本类型
  9. VS2010 error RC2135: file not found
  10. 网易云音乐android变臃肿,网易云音乐版权少,为什么用户还能突破8亿??
  11. 药物临床试验数据递交FDA的规定
  12. 8位数码管动态扫描显示c语言,proteus仿真之8位数码管动态扫描显示试验
  13. 苹果的产品开发流程介绍:带你认识世界最好的设计公司
  14. 无需软件,笔记本自带wifi功能,几条命令轻松搞定
  15. libsvm多分类python_LIBSVM (三) 葡萄酒种类识别
  16. [原创]分期还款的名义利率与真实利率
  17. MySQL备份工具之xtrabackup
  18. win10照片应用打不开的解决方法
  19. Tinker热更新与AndResGuard资源混淆的结合
  20. 黑科技时代,不了解这些你就OUT了

热门文章

  1. 一些关于图论和二叉树的
  2. laravel 数据库操作(表、字段)
  3. android开发之后端云bmob的使用
  4. Oracle对表的基本操作
  5. 使用FSO修改文件夹的名称
  6. LFFD:轻量级人脸检测器,不止是快
  7. mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁
  8. 数据结构期末复习之选择排序
  9. java数组写99乘法表,Java 实现乘法口诀(99乘法表)
  10. sorted函数python_python中排序函数sort,sorted和operator.itemgetter的使用