agc026 题解

Posted houzhiyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了agc026 题解相关的知识,希望对你有一定的参考价值。

agc026

link

code

A \\(\\colorgray\\bigstar\\)

相邻的相同就把它改掉。模拟即可。

B \\(\\colorgreen\\bigstar\\)

先把前面的一些情况特判掉。

注意最后落在的位置一定是形如 \\(\\bmod b =a+d\\) 的形式,判断一下在这个取模环上是否有 \\([b+1,c)\\) 的数即可。

C \\(\\colorgreen\\bigstar\\)

折半搜索。

先大力枚举左边的情况,把对应的右边的情况放在 map 里然后去查询。

D \\(\\colorgreen\\bigstar\\)

一列一列放。

如果前面一列和当前列交的部分全部都是 \\(01\\) 交替,那么可以和上一列状态相同,否则必须取反,然后 \\(>\\) 上一列的部分可以乱选。

因此设 \\(f_i,j\\) 表示前 \\(i\\) 列,从下向上的最长 \\(01\\) 交替段长度为 \\(j\\) 的方案数。

直接转移复杂度 \\(nh\\),离散化一下就可以 \\(O(n^2)\\) 了。

E \\(\\colorblue\\bigstar\\)

提供一个超级无脑做法。

想一下 dp,一个经典套路是从后向前 dp,这样只需要存字典序最大,因为如果从前往后,两个状态一个是另一个的前缀,这样不知道该取那个。

那么如果直接暴力转移是 \\(O(n^3)\\) 的,考虑咋优化一下。

如果后面一个区间是和当前区间不交,那么只要选一个后缀最大值即可,这个可以开一个 \\(g_i\\) 表示后缀最大值。

如果相交,有两种情况:abba

如果是 ba,容易发现这个区间中所有的 ba 都需要选,因此直接选最前面那个即可。

如果是 ab,所有 ab 区间不能交,依然是选最前面那个即可。

三种情况,只有三个转移,直接选即可。

为了方便,直接开 set 记录字符串。

比较卡常,但是讨论一下,上面三个转移可以更少。

F \\(\\colorgold\\bigstar\\)

只会 \\(O(n^3)\\) 的区间 dp。

容易发现对于一个区间,先手答案显然大于后手。

如果 \\(n\\) 是偶数,那么先手要么选所有奇数位置要么所有偶数位置,因为不然的话后手可以选择去奇数的那半边,然后另一个区间变成后手先选,那肯定不优。

然后考虑奇数情况,前面先一直选偶数位置,某一个时刻选了奇数位置,此时剩余区间中,先手一定会得到所有的奇数位置。

那么就相当于是所有的偶数,然后翻转了一个区间。

二分答案,这样会有很多个满足条件的区间。

为了先手一定能缩成一个合法的区间,说明区间需要满足 \\(l_1=1,r_k=n,r_i+2=l_i+1\\)

因此直接判定即可。

以上是关于agc026 题解的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Grand Contest 026 (AGC026) E - Synchronized Subsequence 贪心 动态规划

AGC026D Histogram Coloring

AGC026E - Synchronized Subsequence

AGC025简要题解

AGC 043 C,D 题解

AGC009题解