标签:容量 序列 就会 拼图 钢琴 题意 限制 流量 math
考虑原序列中的所有子序列中,美观值最大的一定是原序列。
那么这些子序列美观度与原序列相同的充要条件是包含每个最值点。
由于我们要构造一个特征值为\(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)\)的,就会被叉。
把每个球(除了1号)和每个食物看做一个点,每个球与在其移动范围内的食物连一条容量为\(w\)的边(食物的重量),并且给每个球一个流量限制,使得其最终重量不能超过1号球,然后跑一个最大流,判断一下所有食物是否能把重量分光,即判断一下最大流是不是等于食物的总重量(预先把1号球能吃的都给1)即可。
二分是显然的。然后就是一个dp再优化一下了。(不优化竟然也能过!)
这似乎是一个和超级钢琴一样的套路。用线段树+堆即可。
线段树维护的数区间最小值即其位置(如果有多个最小值,取任意一个位置即可)。
然后每次询问的话,考虑先找出整段区间的最小值及其位置,然后构成一个四元组\((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)\)。
\(\mathcal O(n ^ 2)\)处理出每个区间的答案,它对一段前缀询问区间产生贡献(打个标记处理后缀max即可)。复杂度\(\mathcal O(n ^ 2 + q)\)。
bitset乱搞。复杂度\(\mathcal O(\frac{n V ^ 4}{\omega})\)。
看上去就是一道启发式合并。每次合并用set合并,而答案显然是随操作单调的。
合并的时候要更新答案,具体就是枚举小的set里面的元素,在大set里面查找前驱后继。
注意如果没有颜色\(x\)的位置或没有颜色\(y\)的位置要直接对set赋值。\(x = y\)时要跳过。
复杂度\(\mathcal O(q + n {\log_2} ^ 2 n)\)。
然后注意set的赋值或赋值是\(\mathcal O(size)\)的,但是交换是\(\mathcal O(1)\)的,所以可行的时候用swap代替赋值。
标签:容量 序列 就会 拼图 钢琴 题意 限制 流量 math
原文地址:https://www.cnblogs.com/psimonw/p/11725796.html