Loading

【题解】AGC021E Ball Eat Chameleons

相当于问有多少个喂球序列,在最优方案下能使得所有变色龙最终为红色。

首先一个啥都没吃过的变色龙,可以给一个红色球使其变为红色,如果给了蓝色球,那么红色球就需要多花费一个,不太值得。

不妨考虑令 \(n\) 号龙为被"牺牲"的那个,然后对于当前喂球序列,考虑每个球:

  • 如果是蓝色:如果有吃过红球且没吃过蓝球的变色龙,给他吃,否则给 \(n\) 吃。
  • 如果是红色:如果有没吃过红球的非 \(n\) 变色龙,给他吃,否则给 \(n\) 吃。

考虑枚举 \(0\leq i\leq n-1\) 表示抵消掉一个蓝球的变色龙数量,本来想爆算然后看看怎么优化,发现最后一段红球不太好处理:也就是最后和 \(n\) 号龙相关的红球的位置并不好计算。

除掉其他变色龙的匹配对,剩下的 \(n\) 号龙的喂球序列是不定的,不妨考虑强行凑对 RB,这样剩下的 \(n\) 号龙喂球序列一定是 B 在前 R 在后,并且最终变成的颜色与原序列相等,变得好统计多了。

发现因为之前的变色龙不一定每个都能取到 RB,所以再次对 \(n\) 号龙喂球序列下手:考虑到不断去除一些 R,使得 B 的个数恰好小于 R 的个数。

枚举去除的 R 和强行凑的 RB 对数 \(t\),此时的局面相当于拯救了 \(t\) 只变色龙,并且恰好拯救了 \(n\) 号变色龙——我们得到了这个喂球序列最多能够拯救的变色龙只数。

做法又 tm 烂尾了。


考虑现在有 \(R\) 个红球,\(B=K-R\) 个蓝球。只需要考虑 \(B\leq R< B+N\) 的情况,显然其他两种情况是否有解都很好判断。

首先对于一个合法的喂球方案,对于一些红球比蓝球多的变色龙,不断的抽出一些红球给其他红球等于蓝球的变色龙,注意到最终一定能使得:有一些变色龙红蓝相等,剩下的红比蓝多一。

此时如果没有红比蓝多一的变色龙,那么喂球序列末尾一定为 B,去掉 B 就得到了一个红比蓝多一的变色龙。

红蓝相等的变色龙可以不断的抽出 R, B 使得其最后剩下 RB,将抽出来的数量相等的 RB 随便塞给红比蓝多一的变色龙即可。

所以我们得到了检验一个喂球序列是否合法的方法:如果能找出 \(N-(R-B)\) 个 RB 子序列那么合法。如果找出来了,那么剩下的球无论怎么喂,剩下的变色龙一定合法(红比蓝多一),所以喂球序列合法。如果找不出来,因为每种合法方案一定满足这个要求,所以喂球序列不合法。

接下来的问题就变成了"求网格图上不超过 \(y=x+k\) 到达终点的方案数",是经典问题。

posted @ 2021-09-01 22:28  Qiuly  阅读(53)  评论(0编辑  收藏  举报