比赛链接: https://atcoder.jp/contests/agc037/tasks 。
A - Dividing a String
注意到最优解一定长度为$1$或$2$,所以直接$\rm dp$就行了。
1 |
|
B - RGB Balls
可以把题意转化为这样:把这个数列顺序扫一遍,然后把当前这个球分配给任意一个没有这个颜色的人,最小化每个人拿到第一个球和拿到最后一个球的时间差。
也就是要最小化每个时刻拿到一个或两个球的人数之和。
那么每次一定是如果能凑满一个人就凑满,否则优先给已经有一个球的人。
那么记录一下每个状态当前有多少人,方案数直接乘一下就好了。
1 |
|
C - Numbers on a Circle
考虑倒着操作,每个操作改为$b-=a+c$,那么我们需要把$b$数组变成$a$。
如果我们当前能操作$x$,那么一定满足$b_x\geqslant b_{x+1}+b_{x-1}$,也就是说如果我们不操作$x$那么一定不能操作$x+1,x-1$,所以这个操作如果不进行那么他永远都不会改变。
所以可以得到一个暴力,每次找到一个可以操作的做一次。
考虑如何优化,拿一个堆存下当前$b_x>a_x$的集合,每次取出$b_x$最大的那个,如果不能操作显然无解,否则就尽量操作到恰好大于等于$a_x$。
这相当于是一个辗转相除的过程,设值域为$v$,那么复杂度就是$O(n\log n\log v)$。
1 |
|
D - Sorting a Grid
考虑对最后的矩阵每一行染色,共$n$种颜色,那么我们只需要保证在第三次操作之前把颜色弄对就行了。
进一步来说,只需要在第二次操作之前使得每一列的颜色构成一个排列即可。
那么只需考虑第一次操作怎么做,我们先确定最左边的一列,容易发现剩下的构成了一个子问题。
考虑二分图,左边为$n$行,右边为$n$种颜色,若第$i$行存在第$j$种颜色就连边,注意到对于每一个行的子集,假设大小为$x$,那么这些行必然包括大于等于$x$中颜色,那么根据$\rm hall$定理可知这个二分图存在完美匹配。
如果用$\rm dinic$实现二分图匹配复杂度为$O(n^3\sqrt n)$。
我总觉得我写网络流的时候有buff。。。这代码我二十分钟不到敲完1a了
1 |
|
E - Reversing and Concatenating
注意到如果最小的字母为$x$,显然我们想最大化串全为$x$的前缀的长度。
那么考虑把给出的串翻转之后接在后面,取出最长的连续一段的$x$,以这一段作为后缀得到第一次操作后的串。
那么接下来的每次操作我们可以把$x$的后缀的长度翻倍。
也就是说我们可以得到一个全为$x$的前缀长度为$mx\cdot 2^{k-1}$的串,其中$mx$为一开始最长连续一段$x$的长度。
那么如何最小化剩下的长度呢,其实只需要在一开始取最长一段$x$的时候长度相等的时候取倒序字典序最小的就行,因为这一段会在最后一次操作被弄成顺序。
1 |
|