AGC012B Splatter Painting [*easy]
反着做,对于每个点 (x), 记录 (f(x)) 表示最大的 (d) 使得对 (x) 进行了一个长度为 (d) 的操作。
然后对于一个操作把和 (x) 距离不超过 (k) 的点染色,拆分成把他旁边所有距离不超过 (k - 1) 的点染色。
如果 (k le f(x)) ,那么不执行操作。
时间复杂度 (Theta(nd))
AGC012C Tautonym Puzzle [*medium]
在左边放 (1...100),答案是右边的上升子序列个数。
假设空序列也算进答案。考虑从小往大放,放左边子序列个数增加 (1),右边子序列个数乘 (2)。
二进制拆分即可。时间复杂度 (Theta(log n))
AGC012D Colorful Balls [*easy]
考虑两个同色的点都可以和同色最小值交换,那么他们俩可以交换。如果一个点可以和同色的最小值交换,那么把这个点的值视为这个同色最小值。
然后考虑不同色的点,那么如果一个点和其他不同色的点交换 (只需要判其他点的 (min)) ,那么他也能和 能和不同色点交换的点
交换,于是这些点都可以互相交换,组合数学算一下答案即可。
时间复杂度 (Theta(n))
AGC012E Camel and Oases [*hard]
对于第 (i) 个问题,可以转化为把整个序列拆分成 (1 + log v) 个序列(拆分后可以重新排列序列顺序),使得第 (1) 个序列包含了 (i),且第 (i) 个序列的相邻两点的差 (le frac{v}{2^{i-1}})
记录 (fl_{i, j}) 表示第 (j) 个序列使用在 (i) 身上能到达的最小左端点,让 (fr_{i, j}) 则为最大右端点。
考虑记录 (pre_{mask}) 表示使用了 (mask) 中所有二进制位为 (1) 的位置已经被使用了的能到达的最大前缀位置,记录 (suf_{mask}) 为能到达的最大后缀位置。
答案就如果对于一个位置 (i) 满足 (pre_{mask} ge fl_{i, 1} - 1) 且 (suf_{mask oplus MAXN} le fr_{i, 1} + 1),那么就是可行的。
但是这样是 (O(nv)) 的,不能通过。
考虑用第 (1) 个序列来把序列分段 (如果相邻两个距离 (> v) 就断开),如果段数 (> log v + 1),那么一定不可行。
所以对于每一段判断一下答案可不可行即可。
时间复杂度 (Theta((v + n) log v))
AGC012F Prefix Median
待填坑