agc026 题解

发布时间 2023-03-22 21:09:05作者: houzhiyuan

link

code

A \(\color{gray}\bigstar\)

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

B \(\color{green}\bigstar\)

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

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

C \(\color{green}\bigstar\)

折半搜索。

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

D \(\color{green}\bigstar\)

一列一列放。

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

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

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

E \(\color{blue}\bigstar\)

提供一个超级无脑做法。

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

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

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

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

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

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

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

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

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

F \(\color{gold}\bigstar\)

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

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

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

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

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

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

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

因此直接判定即可。