[AGC002E] Candy Piles 题解

Description

传送门

Solution

首先抽象问题,将原问题转化到一个平面上进行。

考虑将 a a a 从大到小排序,并建出 n n n 个长方形,其中相邻两个长方形紧挨,从左到右第 i i i 个长方形的宽度为 1 1 1,长度为 a i a_i ai。那么,博弈模型等价于从 ( 1 , 1 ) (1,1) (1,1) 出发,每次向右或者向左走,最终走出边界的人输。

首先不难想到一个 dp \text{dp} dp。令 f i , j f_{i,j} fi,j 表示,当目前在 ( i , j ) (i,j) (i,j) 时(即在第 i i i 个长方形的位置 j j j 处),先手必胜还是必败。至于如何转移,不难发现 f i , j = 1 f_{i,j}=1 fi,j=1 当且仅当 f i , j + 1 , f i + 1 , j f_{i,j+1},f_{i+1,j} fi,j+1,fi+1,j 至少一者为 0 0 0。特别的,若 ( i , j ) (i,j) (i,j) 在边界以外,则 f i , j = 1 f_{i,j}=1 fi,j=1

然而这样是 O ( ∑ i a i ) O(\sum_i a_i) O(iai) 的。考虑如何优化。我们不妨打个表出来,这时你会惊人地发现:

Key Observation

∀ ( i , j ) \forall (i,j) (i,j) 均有 f i , j = f i + 1 , j + 1 f_{i,j}=f_{i+1,j+1} fi,j=fi+1,j+1,其中 ( i + 1 , j + 1 ) , ( i , j ) (i+1,j+1),(i,j) (i+1,j+1),(i,j) 均在边界线以内。

Lemma

首先,若 f i + 1 , j + 1 = 0 f_{i+1,j+1}=0 fi+1,j+1=0,则显然有 f i + 1 , j = f i , j + 1 = 1 f_{i+1,j}=f_{i,j+1}=1 fi+1,j=fi,j+1=1,从而 f i , j = f i + 1 , j + 1 = 1 f_{i,j}=f_{i+1,j+1}=1 fi,j=fi+1,j+1=1。下面只需考虑 f i + 1 , j + 1 = 1 f_{i+1,j+1}=1 fi+1,j+1=1 的情况。

考虑反证。假设 f i , j = 0 , f i + 1 , j + 1 = 1 f_{i,j}=0,f_{i+1,j+1}=1 fi,j=0,fi+1,j+1=1。那么不难发现, f i + 1 , j = f i , j + 1 = 1 f_{i+1,j}=f_{i,j+1}=1 fi+1,j=fi,j+1=1。由于 f i , j + 1 = 1 f_{i,j+1}=1 fi,j+1=1 f i + 1 , j + 1 = 1 f_{i+1,j+1}=1 fi+1,j+1=1,所以 f i , j + 2 = 0 f_{i,j+2}=0 fi,j+2=0;同理,也有 f i + 2 , j = 0 f_{i+2,j}=0 fi+2,j=0。根据 f i , j + 2 = 0 f_{i,j+2}=0 fi,j+2=0,显然有 f i + 1 , j + 2 = 1 f_{i+1,j+2}=1 fi+1,j+2=1;再根据 f i + 2 , j = 0 f_{i+2,j}=0 fi+2,j=0,显然有 f i + 2 , j + 1 = 1 f_{i+2,j+1}=1 fi+2,j+1=1。然而 f i + 1 , j + 1 f_{i+1,j+1} fi+1,j+1 却在 f i + 1 , j + 2 , f i + 2 , j + 1 f_{i+1,j+2},f_{i+2,j+1} fi+1,j+2,fi+2,j+1 均为 1 1 1 的条件下等于 1 1 1,显然不合法。从而假设错误,证毕。


既然这样,我们可以找到 y = x y=x y=x 与边界线的交点。令其为 ( a , a ) (a,a) (a,a),则 a n s = f a , a ans=f_{a,a} ans=fa,a。于是,问题转化为对于边界上的某个点,求出它的 f f f 值。

注意到对于边界上的点而言,除第一步以外它都只有一种走法(因为 a a a 是有序的),于是分类讨论两种情况即可。

时间复杂度 O ( n ) O(n) O(n),本题被完美解决。

所以啊,做不出来了打一打表,说不定你就恍然大悟了。

Code

咕咕咕

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值