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\) 实际上等于:

\[\frac{i\times(i-1)\times\cdots\times(i - k + 1)}{k} \bmod k \]

你这玩意,化简之后有 \(k\) 项,显然是 \(1, 2, \cdots, k-1\),还有一个 \(\lfloor\frac{i}{k}\rfloor\)

我们知道前面这个 \(1\sim k-1\) 乘起来,显然有:

\[\prod_{i=1}^{k-1} i \equiv \left\{ \begin{matrix} k - 1 & k~\text{is prime}\\ 2 & k = 4\\ 0 & \text{otherwise} \end{matrix} \right. \pmod {k} \]

我愿称之为拓展威尔逊定理。

所以:

\[C(i, k)\equiv \left\{ \begin{matrix} (k - 1) \lfloor \frac{i}{k}\rfloor & k~\text{is prime}\\ 2\times\lfloor \frac{i}{k}\rfloor & k = 4\\ 0 & \text{otherwise} \end{matrix} \right. \pmod k \]

考虑枚举 \(k\) 即可,对 \(4\) 的处理应该不用多说,把 \(2\) 提出来,剩下的可以 \(O(1)\) 求。然后题目变成求:

\[\sum_{k\in\text{prime}}\sum_{k \le i\le n} ((k-1)\lfloor\frac{i}{k}\rfloor\bmod k) \]

怎么感觉有点熟悉,\(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\)

\[\sum_{k\in\text{prime}} \sum_{k\le i\le n} -\lfloor\frac{i}{k}\rfloor \bmod k \]

\(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 不断加入一个节点。所以上面所说的问题的解法就是建树。

posted @ 2024-08-07 21:42  lingfunny  阅读(12)  评论(0编辑  收藏  举报