『网赛总结』Day11
暑假以来?包括补题和 VP。
CF
1. CF1982
C
dp + 数据结构优化 / 贪心。
D
转化成解方程。裴蜀定理。
E
分治。每次简化 1/2。
\(f(n, k) = f(m, k) + f(n - m, k - 1), m = 2^x, m < n, m(Max)\)。然后再算一算中间的数量即可。
F
维护序列 \(a_i>a_{i+1}\)。找到不满足条件的最大区间 \([l,r]\),显然要答案区间包含它并且使得值域连续,这里根据最大值最小值 ds 上二分即可(因为前后都是递增的)。
2. CF1989
B
LCS 变形。
C
二分后简单贪心。
D
递归实现被 hack 了。
先一次操作使得 \(c_i\) 在 \(10^6\) 范围内,考虑 dp。
不妨按照限制从小到大 dp,每次转移不能暴力,由于前面所有状态可以转移,并且都是 +1,故 dp 数组单调,维护 \(a-b\) 的最大值作为 \(V_{now}\) 即可。
E
有个 dp 用第 \(k+1\) 维表示大于 \(k\) 的维的总答案的 trick。
本质上我们只关心相同数构成的块的状态。至少出现 \(k\) 个数说明段数大于等于 \(k\)。
前缀和优化 dp。注意特殊情况:不在开头或者结尾的长为 \(2\) 的段。因为还原在 \(b\) 里面是 2 个 1。会和分成 2 个 1 的段重复计算。
3. CF1983
B
-
对每个 \(2\times 2\) 的矩阵操作,易证成立。
-
结论:每行每列关于 \(3\) 同余。
C
可以暴力确定前面和后面的分界点,判断中间是否成立即可。
D
不妨 \(r=l+1\),发现所有 \(r>l\) 的情况都可以分解成多个 \(r=l+1\) 的操作。
考虑直接排序,一个数组排完过后一直 1 2
跳即可。发现只要奇偶性不变就可以。
又知这样子排序的交换次数是逆序对个数,bit 计算。
E
每个普通球的是贡献相似的。(所以实际上可以权值累加)
组合意义:普通球放一排,两人交替选择,中间可以插入特殊球,这些球的主人和后面的普通球一样。首尾可插,并且可重复插。
注意 Alice 选的都是奇数位的球,可以算出普通球和特殊球的位置占比,得出期望。
F
不难想到二分答案然后对满足条件的计数。(trie 上可以实现计算小于等于一个数的信息)
扫描 \(r\),trie 上每个节点维护最后一次到达的下标 \(lst_x\),就是所有满足小于等于二分值的 \(lst_x\) 的最大值。(在这个点前面一定能取到最小值)
不要忘记保留历史版本的 \(lst\) 最大值。
4. CF1988
C
长度就是 \(n\) 的二进制 1 个数加 1,因为每个位置都可以不选一次。这是基于限定选择位置和 \(a_i\) 单增的贪心。
D
对所有人被染色时间 dp 即可。证明这个染色时间是 log 级别。
复杂度就是一个 mex 计算,\(f(i)\) 表示颜色 \(i\) 的 \(minsiz\),有 \(f(i) = 1 + \sum (j<i) f(j)\)
\(f(1) = 1, f(i) = 2^{i-1}\)。
5. CF1994
C
二分确定 dp 转移点,像一道 arcb。
D
鸽巢定理证明一定有解。
具体的,反着操作。你的同余系必定有 \(x+1\) 个,而你要找到和 \(x\) 同余的。
实现也简单,能加就加,平方对数。
E
按位贪心。
首先如果一个位超过 2 个,那么另一个一定可以把后面全部变成 1,直接跳出。
上面这个性质很强,说明跳出之前,前面的都只有 1 次。
每次都贪心留下这一位的答案即可,发现这是下界,考虑上界,由于唯一,如果要前面一位来调整的话就会丢弃那一位的 1,不优。
F
欧拉回路。
考虑预处理,让部分边变得重要,同时保证一定有解(度数是偶数,这可以通过 dfs 实现)。
最后就可以跑欧拉回路了。
6. CF1990
C
2 次过后数组就单增了,很好观察出来。
然后整个数组的变化就是向右平移,所以每个连续段的贡献是一个分段函数。
D
贪心。舍弃掉 >4 的行。算相邻两个段之间可不可以减少答案。
7. CF1995
B2
先判掉 \(s\) 相等的情况。
否则,考虑先选择 \(s\),然后继续选 \(s+1\)。最后,看能否用 \(s+1\) 换掉一些 \(s\)。
C
贪心,保存指数进行 log 运算。
D
转化:每 k 个位置必须有一个 1。
设 \(S\) 是你选的最终颜色状态。
要 \(S\) 和每个 \(P\) 有交,\(P\) 是每个 \(k\) 段的 \(c_i\) 集合。
将 P 取反,可以得到等价条件:所有 \(i\),\(S\) 不包含于 \(P_i\)。
理解就是取反之后,原来 P 是 1 的直接变成 0 了,只要 S 有 1 就行了。
可以做 bool 的高维后缀和。
8. CF1993 (VP)
C
循环节显然是 \(2k\),所以对于每个灯你可以知道它在模意义下的 \(l,r\),我们需要求最小的 \(s\),使得 \(s\bmod 2k\) 被所有 \([l,r]\) 区间包含。并且 \(s\ge maxn\)。
第一个限制直接做数组差分即可。第二个好算。
D
二分 + dp
平方 dp 是显然的,需要根据题目性质优化到线性。
性质:所有转移位置在 \(k\) 的同余系下不等且递增。
考虑每次转移是从 \(i-1\) 或者 \(i-k\) 转移而来,\(i-k\) 的意思是舍弃一段,\(i-1\) 是接上上一个。
如果 \(i\bmod k = 1\),则一定不能在前面一段的基础上接上 \(a_i\)。根据性质得证。
其它情况就可以从 \(i-1\) 和 \(i-k\) 转移过来了。
F
有个 trick 是一次调头相当于接着走,将长宽扩大一倍,每次行走赋予模意义这样就成功地去除了调头的限制。
设走 \(j\) 步后到达 \(x_j,y_j\),到达 \((0,0)\) 等价于 \(x_j\) 和 \(2w\) 同余,……。
考虑 \(k\),设 \(X=x_n,Y=y_n\),有方程:
可以转化成两个 \(i\equiv a \pmod b\) 的形式。
excrt 合并一次即可,得出最小非负整数解,然后根据解的范围算出答案。
9. CF1998
B
我们的构造要向“每个区间只有 1 个数不一样考虑”。
C
比较难。但是出的好。
注意到如果我们不删除中位数这个位置的数,那么那个数是一定的。
所以我们可以把 \(k\) 加到最大的可以加的数上,统计答案就在这个数,然后二分算中位数即可。
其它策略?我们可不可以使得中位数变大一点?
此时我们就询问 \(a_n\),然后通过操作来使得中位数最大即可。
操作也是很好想的,如果对 \(a\) 排序然后每次二分实现的话复杂度就是 \(O(n\log V)\) 的。
D
如果你提前求出从 1 到达每个点的最少时间,你发现不好做,因为你要限制的区间是有约束的。
换句话说,假设 A 从 \(s\) 开始走到 \(t\),你知道 \(dp_t\),但是 \(dp_t\) 可能由 \([s,t)\) 的数转移过来,就没办法了。
解决方法也很好想,顺序扫描,每次统计从 \(i\) 出发的边所造成的贡献。对于边 \(i\to to\),此时只考虑了 \([1,i)\) 的边,所以对于 \([i+1,to)\) 的点,这时的 dp 值完全是不限制的、正确的;所以我们计算一下影响区间就好了,打一个数组差分。
E
笛卡尔树。直接区间上做也可以。
建出树来,发现如果 \(sum_l\) 大于 \(a_x\) 的话,那么 \(l\) 就一定可以替代 \(x\)。\(r\) 同理。
但是有一个前提,就是到祖先的路径上的点都是可以的。
所以两次 dfs 即可。
严谨的证明你考虑每次操作是 upd 和删除,那此时 \(x\) 和 \(l,r\) 所表示的数在 \(S\) 里面就一定是相邻的。
其实我交上去发现过了也觉得很不可思议。
E2 还不会。
加强版:[JOISC2022] 鱼 2。
在笛卡尔树的角度想是没有前途的,看能不能转化成区间的性质。
若 \(pre_r-pre_{l-1} \le \min(a_{l-1},a_{r+1})\),则 \([l,r]\) 内的所有数都不满足条件。
估计不会补了。
10. CF2004
我快出生了。
D
如果 \(l\) 和 \(r\) 有重合,那么就直接 \(|i-j|\)。
否则,对于一个不完全同于 \(l\) 的位置,它一定部分重合于 \(r\)。
所以你直接枚举在 \(l\) 左边,区间内,\(r\) 右边的情况即可。
E
Nim + sg
对每个 \(a_i\) 算 sg 函数,判断所有 sg 异或是否是 0。
打表找结论,但我不会证。
结论:
-
若 \(a\) 是质数,则 \(sg(a)\) 是 \(a\) 的质数编号。
-
否则,\(sg(a)\) 是 \(a\) 的最小质因子的 \(sg\) 值。
线性筛即可。要特判 1 和 2。
F
需要观察到分裂操作一定不优,这里有各种情况,但是你都是可以直接合并做的。
考虑区间 dp,\([l,r]\) 从 \([l',r']\) 能够转移过来,可以推出限制:\(s_r+s_{l-1}=s_{r'}+s_{l'-1}\)。
这告诉我们同一个和下,区间都是包含关系,显然可以转移。
那么我们就可以按照 \(s\) 和来进行分组 dp 了,转移的代价就是,有一个 \(s\) 出现就可以减少 2 的代价。
注意最后 \([],[]\) 的情况,舍去即可。
11. CF2001
C
对于每个点暴力询问 \((1,i)\)。一定会返回路径中间的点,并且题目自动帮你二分了,所以复杂度是对的。
D
看来这种古怪的定义多半都只能是暴力+优化。
暴力选择最小字典序,奇数选最大,偶数最小。
一个数能选择必须它的位置后面出现了所有还没有选的数,这个直接记录 \(nxt\) 数组,丢进 set 里面,我们就可以知道这一次选择区间的 \(r\)。
考虑 \(l\)?就是上一个位置 +1。现在限制都没了,就是区间里面查最值,ds 即可。
注意还有每个数只选一次的限制,所以每次把这个数的位置都在 ds 上给删除。