A 一看是橙色的,跳了。
B RGB Balls
一个显而易见的贪心是考虑加进来一个颜色,如果能正好和剩下的组成一组,那么就一定让他们组成一组。留着的话前面剩下的能造成的极差一定更大。而如果组不成一个,也尽可能让他当第二个。实在加不进去了再让他当第一个。
这样我们实时维护一下 R,G,B,RB,RG,GB
的数量即可。然后因为每形成一个这样的二元组或三元组,都是在少一个元里面的挑一个。而且所有新加进来的这种颜色都是要优先组成更大的,所以无论和同类型的哪种匹配都是一样优的。每形成一种这样的多元组,就要乘上他的可能性。
C Numbers on a Circle
我们考虑从后往前逆着推,考虑一个点能通过不断地减两边得到终止状态。我们考虑最大值,最大值如果比他两边的和还要小,说明这个数动不了了,就说明无解。否则就可以一直减,反正中间有别的操作肯定不影响左右两边的值。所以直接减到不能减或者终止状态为止。如果减完了发现到不了终止状态,但是最后比中止状态小了,就说明无解了,否则就这么干就行((
然后复杂度我不会分析。感觉像 gcd?
D Sorting a Grid
感觉像网络流。打了一下发现果然是网络流,于是我们就这么写了。
考虑是要 C 每一列都是 \(n\) 的排列,然后对 C 的每一列排序就行。
所以我们考虑怎么求 C。对每一行建一个点,每种颜色建一个点(颜色就是排序后点该在的行),然后连边,跑出来一个完美匹配就是一列的方案,跑 \(m\) 次,每次删掉选了的边,就是 \(m\) 列的方案。
然后考虑为什么这么做就对。
首先前置知识:
Hall 定理: 对于一个二分图,其存在完美匹配的充要条件就是两侧点集大小相同,并且从一侧选出一个非空子集 \(S\),从 \(S\) 连出的边形成另一侧的点集大小大于等于 \(|S|\)
证明:
咕咕咕
然后我们考虑取了 \(k\) 次,考虑现在能否取出一个完美匹配。已知每行现在向每种颜色连了 \(m-k\) 条边。每种颜色向每行也连了 \(m-k\) 条边。
考虑反证法。假设现在取出行的一个子集 \(S\),它连向的子集是 \(|T|\),假设 \(|S|> |T|\),那么 \(S\) 向 \(T\) 连了 \(|S|(m-k)\) 条边,而已知 \(T\) 总共只连出了 \(|T|(m-k)\) 条边,所以矛盾。
所以我们这么做每次都能取出一个合法完美匹配。
E Reversing and Concatenating
还好吧这题。
就是考虑最优的是让最小的字母在开头最长。
如果是最后一个字母最小,那么直接反复翻篇,长度就是 \(\min\{l_n 2^K,n\}\),\(l_n\) 表示以某个位置结尾的连续最小字符长度。
否则就是需要先用一次操作使他到最后,然后也是反复翻,长度就是 \(\min\{l_i 2^{K-1},n\}\)
最小字符的长度是那么长,而如果是剩下的,直接在选的位置找个最小的前缀就行了。
F Counting of Subarrays
假如说一个序列全是一种字符,那么直接判断 \(n\geq L\) 就行。
考虑如何判断一个序列是合法的。
我们找到一个最小的数字,把他的连续段都找出来。如果一个连续短小于 \(L\),那它第二个值不可能达到 \(L\) 了,那么一定无解。否则我们把所有连续段,假如说当前最小值为 \(c\),长度为 \(k\) ,合并为 \(\lfloor\frac k L\rfloor\) 个 \(c+1\)。因为把 \(L\) 个 \(c\) 合并起来得到 \((c+1,L)\),等价于一个单独的 \(c+1\)。
这样如果最后就剩一个数了,那么就说明可以。
然后考虑怎么统计所有子段。我们考虑维护每一个位置,是由多少个前面的位置合并到这里,并以这里结尾,设为 \(l_i\),同理设一个 \(r_i\) 。还像之前那样合并。然后统计贡献即可。但是这样会重复计算合并之后的答案,所以合并之后要减掉。
然后再合并一下 \(l,r\) 就行了。
复杂度,每次至少少了 \(L-1\) 个数字,如果用 set
维护一下连续段就是 \(O(n\log n)\) 的。