2024年8月6日 加训

2024年8月6日 加训

赛时只过了 C。D 有思路,不过没写。

A CF1969E 2402*

把一个数修改之后,显然直接把序列拆成两个部分。

找出所有的 (prev(i),next(i)),那么所有合法区间都是包含 i 的子区间。

然后考虑 dp 划分,f[i] 表示前缀 i 最少需要几次修改,转移就是当 (j,i] 是合法子区间,可从 f[j]+1 转移过来。

假了。判断所有子区间是不是合法区间非常难。

题解

直接从左往右贪心啊哥们,你在 dp 牛魔。这都没想到直接退役吧。

B CF1957F2 2847*

树,点有点权。q 次询问,找出树上两条路径 u1v1u2v2 哪些点权的出现次数不一样,最多找 10 个即可。

不会啊,初步想法 XOR HASHING,或者点分治,但是如果是出现次数这种问题,还得是 XOR HASHING 或者根号分治吧,但也不像能根号的样子(完全没找到什么能均摊)。感觉这题应该挺随机化的。

题解

考虑简单版本的,在序列上,求两段区间哪些颜色出现次数不同。

做法是给每种颜色随机一个哈希值,然后扔到主席树上,可以在主席树上二分找出哪个颜色出现次数不同。

树上同理,拆成 uroot 的路径,对这个建立主席树,查询 LCA 即可。

C CF1957E 2501*

感受了一下,应该是个威尔逊定理。因为求 C(i,k)modk 实际上等于:

i×(i1)××(ik+1)kmodk

你这玩意,化简之后有 k 项,显然是 1,2,,k1,还有一个 ik

我们知道前面这个 1k1 乘起来,显然有:

i=1k1i{k1k is prime2k=40otherwise(modk)

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

所以:

C(i,k){(k1)ikk is prime2×ikk=40otherwise(modk)

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

kprimekin((k1)ikmodk)

怎么感觉有点熟悉,imodk=ikik,这个式子可以化简为:(k1)ik=iimodkik。这个还要对 k 驱魔,显然前面两项可以删掉。于是变成 ik

kprimekinikmodk

k 枚举倍数,变成区间加,可处理出 n=11000000 的答案,复杂度 O(nlogn)。不过在上面那个未化简的式子的时候就可以做了。

原来这么多知识点中我数论学的最好

D CF1956E2 2906*

不是很懂,模拟?但是模拟不出来。

好像可以模拟直到第一个 0 出现,这一步是 O(nlogv) 的(大概),因为在 n=3 的时候类似一个斐波那契,所以 n 为奇数大概就是斐波那契了。n=2 也是同理,好像走一圈就可以得到斐波那契形式的不等式。

找到第一个 0,就能找到第一个一定存活的位置,继而找到下一个 0

找到一个一定存活的位置 i,设其值为 x 可以知道 i+1 将会经历:yyxy2x,这个显然可以 O(1) 求。得到其存活 k 轮。接下来,我们考虑 i+2,将会经历:zzy+xz2y+3x,这个显然是一个关于时间的二次函数,系数还是非 0 整数,所以 z 存活不超过 ai 轮,这个没关系,我们仍然暴力二分。再往下,p 就不会存活超过 a3i 轮了,我们可以直接保留权值这些变化的权值,直接做,是 O(nai3) 的。如果感觉不够保险,可以用三次函数二分,然后保留四次函数的权值,是 O(nai4) 的,这还不能过?

题解

差不多是这个意思,我们暴力做 ai3 轮,任何连续 4 个有值的都会死。然后在单个块中查询。本质相同,实现不同罢了。我的做法是按边统计边分割,此做法是先分割再统计。但是 u1s1,题解的做法更快。

然后我会证明找到第一个 0O(logv) 的了。其实就是 xk=v,求 k 的最大值。显然 x=2k 最大,为 logv

E CF1951F 2609*

这能写?感觉没啥性质,特别是置换我很不熟悉。更主要的,C 和 D 花太多时间,现在没时间了。

题解

考虑排列 p 中的顺序和逆序对分别会对 k 产生什么影响。

p 中存在 pi>pj,i<j,对 qpiqpj 的值分讨,会发现一定会产生 1 的贡献。

p 中存在 pi<pj,i<j,分讨后会发现产生 02 的贡献,

然后对 q 从前往后填,假设在填位置 i,找到 ip 中的下标 j,然后考虑 j 能和在其后面且大于他的构成几个顺序对 c,如果 k>c 就直接填当前最大数,否则就讨论一下即可。

F CF1949J 2727*

先伸展一下,然后直接走进目标位置不就好了?

问题在于,怎么判断缩回去哪个格子,格子往哪边走。往那边走比较简单,从目标节点开始 BFS,找到最近的点,然后沿最短路前进就好了。问题在于,怎么判断缩回去哪个格子,要求缩回去的格子不是割点。

题解

双向搜索,每个状态朝可达的字典序最小的状态移动。但感觉需要证明这样搜一定能到达目标状态。

官解是,找到一个 A 的外边界与 B 的外边界之间的最短路,然后对 A、B 分别建立一棵树,A 不断删叶子,B 不断加入一个节点。所以上面所说的问题的解法就是建树。

posted @   lingfunny  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示