loj rounds 补题
Posted psimonw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了loj rounds 补题相关的知识,希望对你有一定的参考价值。
LibreOJ β Round
ZQC 的树列
考虑原序列中的所有子序列中,美观值最大的一定是原序列。
那么这些子序列美观度与原序列相同的充要条件是包含每个最值点。
由于我们要构造一个特征值为(k)的序列。其实只用(0, 1, 2)三种元素就能构造。构造的序列一定是一段0(,一段1),一段2(,一段1),一段0(,一段1)...
考虑一段长度为(l)的连续1的贡献为(2 ^ l),一段长度为(l)的连续0或2的贡献为(2 ^ l - 1)。相当于把(k)分解成这种数的乘积。(只要分解出来,长度一定不会超过限制)
这个东西其实有点困难。因为朴素的贪心分解(从大到小枚举因数)是错的,反例如(315 = 3 * 3 * 5 * 7 = 5 * 63 = 3 * 7 * 15)。
但是其实反例很少,因为这种情况只会出现在要分解的数能被(63)整除的情况下。把63屏蔽掉即可。
为什么只有63被屏蔽呢?事实上因为它是满足((2 ^ k - 1) | prod_{i = 2} ^ {k - 1} (2 ^ i - 1))的,就会被叉。
ZQC 的游戏
把每个球(除了1号)和每个食物看做一个点,每个球与在其移动范围内的食物连一条容量为(w)的边(食物的重量),并且给每个球一个流量限制,使得其最终重量不能超过1号球,然后跑一个最大流,判断一下所有食物是否能把重量分光,即判断一下最大流是不是等于食物的总重量(预先把1号球能吃的都给1)即可。
ZQC 的拼图
二分是显然的。然后就是一个dp再优化一下了。(不优化竟然也能过!)
ZQC 的手办
这似乎是一个和超级钢琴一样的套路。用线段树+堆即可。
线段树维护的数区间最小值即其位置(如果有多个最小值,取任意一个位置即可)。
然后每次询问的话,考虑先找出整段区间的最小值及其位置,然后构成一个四元组((l, r, v, x)),考虑每次在堆中取出(v)最小的四元组,然后加入((l, x - 1, query(l, x - 1).v, query(l, x - 1).x))和((x + 1, r, query(x + 1, r).v, query(x + 1, r).x))即可。复杂度(mathcal O(q {log_2} ^ 2 n))。
LibreOJ β Round #2
模拟只会猜题意
(mathcal O(n ^ 2))处理出每个区间的答案,它对一段前缀询问区间产生贡献(打个标记处理后缀max即可)。复杂度(mathcal O(n ^ 2 + q))。
贪心只能过样例
bitset乱搞。复杂度(mathcal O(frac{n V ^ 4}{omega}))。
DP 一般看规律
看上去就是一道启发式合并。每次合并用set合并,而答案显然是随操作单调的。
合并的时候要更新答案,具体就是枚举小的set里面的元素,在大set里面查找前驱后继。
注意如果没有颜色(x)的位置或没有颜色(y)的位置要直接对set赋值。(x = y)时要跳过。
复杂度(mathcal O(q + n {log_2} ^ 2 n))。
然后注意set的赋值或赋值是(mathcal O(size))的,但是交换是(mathcal O(1))的,所以可行的时候用swap代替赋值。
以上是关于loj rounds 补题的主要内容,如果未能解决你的问题,请参考以下文章
cf比赛记录Codeforces Round #601 (Div. 2)
Codeforces Round #725 (Div. 3)(补题)