agc026 题解
Posted houzhiyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了agc026 题解相关的知识,希望对你有一定的参考价值。
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\\) 表示后缀最大值。
如果相交,有两种情况:ab
和 ba
。
如果是 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 贪心 动态规划