2024年8月6日 加训
2024年8月6日 加训
赛时只过了 C。D 有思路,不过没写。
A CF1969E 2402*
把一个数修改之后,显然直接把序列拆成两个部分。
找出所有的 \((\text{prev}(i), \text{next}(i))\),那么所有合法区间都是包含 \(i\) 的子区间。
然后考虑 dp 划分,f[i]
表示前缀 \(i\) 最少需要几次修改,转移就是当 \((j ,i]\) 是合法子区间,可从 \(f[j] + 1\) 转移过来。
假了。判断所有子区间是不是合法区间非常难。
题解
直接从左往右贪心啊哥们,你在 dp 牛魔。这都没想到直接退役吧。
B CF1957F2 2847*
树,点有点权。\(q\) 次询问,找出树上两条路径 \(u_1\to v_1\) 和 \(u_2\to v_2\) 哪些点权的出现次数不一样,最多找 \(10\) 个即可。
不会啊,初步想法 XOR HASHING,或者点分治,但是如果是出现次数这种问题,还得是 XOR HASHING 或者根号分治吧,但也不像能根号的样子(完全没找到什么能均摊)。感觉这题应该挺随机化的。
题解
考虑简单版本的,在序列上,求两段区间哪些颜色出现次数不同。
做法是给每种颜色随机一个哈希值,然后扔到主席树上,可以在主席树上二分找出哪个颜色出现次数不同。
树上同理,拆成 \(u\to \text{root}\) 的路径,对这个建立主席树,查询 LCA 即可。
C CF1957E 2501*
感受了一下,应该是个威尔逊定理。因为求 \(C(i, k) \bmod k\) 实际上等于:
你这玩意,化简之后有 \(k\) 项,显然是 \(1, 2, \cdots, k-1\),还有一个 \(\lfloor\frac{i}{k}\rfloor\)。
我们知道前面这个 \(1\sim k-1\) 乘起来,显然有:
我愿称之为拓展威尔逊定理。
所以:
考虑枚举 \(k\) 即可,对 \(4\) 的处理应该不用多说,把 \(2\) 提出来,剩下的可以 \(O(1)\) 求。然后题目变成求:
怎么感觉有点熟悉,\(i\bmod k = i - k\lfloor\frac{i}{k}\rfloor\),这个式子可以化简为:\((k - 1)\lfloor\frac{i}{k}\rfloor = i - i \bmod k - \lfloor\frac{i}{k}\rfloor\)。这个还要对 \(k\) 驱魔,显然前面两项可以删掉。于是变成 \(-\lfloor\frac{i}{k}\rfloor\)。
对 \(k\) 枚举倍数,变成区间加,可处理出 \(n = 1\sim 1000000\) 的答案,复杂度 \(O(n \log n)\)。不过在上面那个未化简的式子的时候就可以做了。
原来这么多知识点中我数论学的最好
D CF1956E2 2906*
不是很懂,模拟?但是模拟不出来。
好像可以模拟直到第一个 \(0\) 出现,这一步是 \(O(n\log v)\) 的(大概),因为在 \(n = 3\) 的时候类似一个斐波那契,所以 \(n\) 为奇数大概就是斐波那契了。\(n = 2\) 也是同理,好像走一圈就可以得到斐波那契形式的不等式。
找到第一个 \(0\),就能找到第一个一定存活的位置,继而找到下一个 \(0\)。
找到一个一定存活的位置 \(i\),设其值为 \(x\) 可以知道 \(i + 1\) 将会经历:\(y\to y-x\to y-2x\to \cdots\),这个显然可以 \(O(1)\) 求。得到其存活 \(k\) 轮。接下来,我们考虑 \(i + 2\),将会经历:\(z\to z-y+x\to z-2y+3x\),这个显然是一个关于时间的二次函数,系数还是非 \(0\) 整数,所以 \(z\) 存活不超过 \(\sqrt a_i\) 轮,这个没关系,我们仍然暴力二分。再往下,\(p\) 就不会存活超过 \(\sqrt[3] a_i\) 轮了,我们可以直接保留权值这些变化的权值,直接做,是 \(O(n\sqrt[3]{a_i})\) 的。如果感觉不够保险,可以用三次函数二分,然后保留四次函数的权值,是 \(O(n\sqrt[4]{a_i})\) 的,这还不能过?
题解
差不多是这个意思,我们暴力做 \(\sqrt[3]{a_i}\) 轮,任何连续 4 个有值的都会死。然后在单个块中查询。本质相同,实现不同罢了。我的做法是按边统计边分割,此做法是先分割再统计。但是 u1s1,题解的做法更快。
然后我会证明找到第一个 \(0\) 是 \(O(\log v)\) 的了。其实就是 \(x^{k} = v\),求 \(k\) 的最大值。显然 \(x=2\) 时 \(k\) 最大,为 \(\log v\)。
E CF1951F 2609*
这能写?感觉没啥性质,特别是置换我很不熟悉。更主要的,C 和 D 花太多时间,现在没时间了。
题解
考虑排列 \(p\) 中的顺序和逆序对分别会对 \(k\) 产生什么影响。
若 \(p\) 中存在 \(p_i > p_j, i < j\),对 \(q_{p_i}\) 和 \(q_{p_j}\) 的值分讨,会发现一定会产生 \(1\) 的贡献。
若 \(p\) 中存在 \(p_i < p_j, i<j\),分讨后会发现产生 \(0\) 或 \(2\) 的贡献,
然后对 \(q\) 从前往后填,假设在填位置 \(i\),找到 \(i\) 在 \(p\) 中的下标 \(j\),然后考虑 \(j\) 能和在其后面且大于他的构成几个顺序对 \(c\),如果 \(k > c\) 就直接填当前最大数,否则就讨论一下即可。
F CF1949J 2727*
先伸展一下,然后直接走进目标位置不就好了?
问题在于,怎么判断缩回去哪个格子,格子往哪边走。往那边走比较简单,从目标节点开始 BFS,找到最近的点,然后沿最短路前进就好了。问题在于,怎么判断缩回去哪个格子,要求缩回去的格子不是割点。
题解
双向搜索,每个状态朝可达的字典序最小的状态移动。但感觉需要证明这样搜一定能到达目标状态。
官解是,找到一个 A 的外边界与 B 的外边界之间的最短路,然后对 A、B 分别建立一棵树,A 不断删叶子,B 不断加入一个节点。所以上面所说的问题的解法就是建树。
本文来自博客园,作者:lingfunny,转载请注明原文链接:https://www.cnblogs.com/lingfunny/p/18347926