3 月做题记录
P6292
考虑建出 SAM 后扫描线。
考虑目前一个等价类集合长度区间为
P11830
考虑怎么判定
对于
值域很大,离散化后每段本质相同,双指针后判断即可。复杂度
P11831
考虑时间轴分块,每 bitset
即可。
取
P11833
不难注意到按照
注意到我们要做的就是,找到一个位置,然后将一段区间覆盖为等差数列,这个东西很容易线段树维护区间覆盖等差数列区间求和,还需要一个线段树二分。复杂度
ARC160D
考虑倒着生成序列。每次选择一个数加
令
至此可以直接容斥做到
也有一种比较无脑的做法,枚举
ARC146D
可以将每个条件转化成四个条件,每个条件形如
考虑建图,
初始取
ARC183D
忽略每次删叶子后树有完美匹配的性质,以重心为根,答案有上界
对于原题,我们声称答案仍然可以取到上界。
首先,对于一棵树来说,任取一点为根,称
- 总点数为偶数。
- 对于每个
类点,其所有儿子都是 类点。 - 对于每个
类点,其恰有一个儿子是 类点。
忽略第一个限制,可以发现删除叶子
对于重心的每个子树,可以 DFS 求出一个删叶子顺序,重心必然在任意时刻都恰有一个儿子子树大小是奇数,其他是偶数,在偶数中选子树大小最大的点和这个奇子树配对并更新子树大小即可。
ARC153D
考虑
然后考虑数位 DP,对于从右到左第 set
访问首迭代器的复杂度是
ARC185D
考虑只有一条链怎么做。这是很经典的,记
对于若干条链来说,先考虑两条链怎么做,考虑将过程分为到达某个链底端,然后走到另一个链底端。第二部分就等价于一条链从左走到右,第一部分等价于只有一条链,因为每次往上和往下都可以对应成一条链的情况。
对于更多的链,考虑仍然将过程分段,依次是到达每条链的底端。根据期望的线性性将每段答案求和即为最终期望。
第一次到达链底相当于就是只有一条链,而后面的每次等价于事实上只有两条链,但是到根后往已经走过的链和未走过的链的概率不同,这个东西和一条链上的部分一样,只需要把根往下的答案重算一下即可。复杂度
ARC176D
考虑
枚举
考虑矩阵,对这些东西的贡献转移写成矩阵形式即可。
P6976
考虑分治,每次在当前多边形内选一条边把多边形断开,将两边的询问递归,跨过边的询问直接从选择的边的端点开始 BFS。
考虑复杂度,可以证明必然存在一条边使得较小侧点数至少为
BZOJ3591
加强版:
原题是,考虑一般的 DP 套 DP,考虑用那个维护单调序列的做法维护 LIS,那么每个数只有三种状态:不在序列中,在序列中但不在队列中,在队列中。用一个三进制状态即可做到
这个做法太菜了,考虑按照值域插入所有数,我们只需要记录
要求给定序列在排列中,考虑记
CF1142D
考虑对于符合条件的数
观察规律能看出
然后直接 DP,
CF995F
比较容易猜出答案关于
另一个做法是,考虑记
考虑
CF1499G
好题啊。
先考虑无修改。
这是一个比较经典的问题:给定一个二分图,选一些边,使得每个点的选与没选的邻边数差的绝对值总和尽可能小。
对于这个问题,从所有点度数为偶数下手,此时图存在欧拉回路,求出一条欧拉回路后考虑每条被定向的边
有些点度数为奇数时,答案下界为
考虑原题,现在要在线加边,维护欧拉回路。问题是由于虚点存在,可能还有删边,不容易做。
考虑这个东西的本质,事实上我们可以证明我们只需要求出以下问题的解即可还原答案:
将二分图的边划分为若干环和路径,路径不要求简单,使得每个点至多成为一条路径的端点。
对于环和路径,都是交替地取边,这一定可以得到最小答案,原因是考虑度数为偶数的点无论如何都只会在环上或者路径的非端点处,所以贡献为
剩下的过程就很容易了。考虑在路径端点维护对应路径,每条路径只在其一个端点维护。则加入一条边时,分类讨论:
- 两端都不为路径端点,直接加入这条边作为路径。
- 有且仅有一端为路径端点,将路径加上这条边扩展为新路径。
- 两段都为路径端点且属于同一路径,加入这条边后成为环,将环上边删去并加入到答案即可。
- 两段都为路径端点且不属于同一路径,合并两条路径。
使用 deque
可以很好地支持这个操作,注意到复杂度瓶颈在于最后一种情况的合并路径,于是启发式合并即可。复杂度
CF1149E
对于每个点
定义
证明:
- 终止状态必然满足
,则有 。 - 对于
的局面,考虑操作任意一个点 ,那么 减少,必然有 ,并且由于 为一步到达的点的 的 ,于是 不可能通过修改其他点进行更改,于是 , 。 - 对于
的点,找到最大的 使得 ,考虑 是若干数的异或,根据 nim 游戏的结论总能减少某个 的 使得 。同时, 的所有一步到达的点都能被任意修改,所以总存在方案使得操作后 。 - 局面构成的博弈是有向无环图。考虑若存在某个局面在至少一次操作后回到了这个局面,则考虑最后一次操作的
必然在之前的操作中成为过被修改的后继,对那个点重复论证即可得到原图有环,与题意矛盾。
如果能看懂证明的话构造方案是容易的。
CF1830F
考虑朴素 DP,记
在枚举
CF1158E
对于猜树的形态,经常考虑的做法是以某个点为根后依次确定每个点的深度和父亲。
假设树以
-
确定每个点的深度。
注意到我们将
设为 和 进行两次询问就能求出所有深度为 的点,并且能分出深度 的和深度 的点。进行类似分治的过程,初始时求出深度为
的深度的点,然后可以发现每一步我们得到了形如若干 的区间,表示深度在区间 内的点恰好是集合 ,并且可以发现深度为 的所有点必然已经被求出。那么将深度为 的点的 设为 和 就可以将区间划分为 。考虑将过程并行维护,但是发现下一个区间可能会通过父亲的若干条边影响之前的区间,但是这个过程是分治执行的,所以把奇数编号的区间拉出来并行,偶数拉出来并行,两两之间不会影响。
上述的询问次数是
。 -
确定每个点的父亲。
对于深度为
的点,依次考虑二进制下每一位 ,将这些点中编号这一位是 的点的 设为 ,则深度为 的点的父亲这一位是 当且仅当回答的结果为 。于是将所有回答结果加权求和即可得到 层每个点的父亲。这个过程可以模
分组并行,询问次数 。
总询问次数
P11832
对于图是树的时候,以
图不是树时,发现环的构造情况较少,具体地只要确定了在序列中出现的最靠前的位置,其他点要么顺时针排列要么逆时针排列,所以事实上环上的点在序列中顺序必然是某个顺时针或逆时针顺序。
注意到同胚于
建圆方树,发现对于圆点来说,结论和树上一样,递归到子树构造并随意排列后插入,对于方点限制有所不同,儿子节点必须按照哈密顿回路上的顺序,也就是只有两种需要考虑的顺序,贪心取较小的即可。
所以只需要求一个这样的点双的哈密顿回路即可,直接按照广义串并联图的套路即可,不过这题不需要缩一度点,因为任意时刻都不会有叶子,所以只需要缩二度点与叠合重边,叠合重边时将原有边覆盖即可。
图不连通时先求出每个连通分量的序列答案,注意到我们只需要求任意两个联通分量序列上要么不交要么包含,排序后可以贪心构造答案。
CF1147F
无边权限制时,后手必胜当且仅当图的所有最大匹配都包含起点。但是图是完全二分图,所以后手必胜。
有限制时,后手仍然必胜,只需要找到一个稳定婚姻系统即可。
CF1400F
注意到本质就是给定若干字符串,要求删若干字符使得这个串中不出现给定串,对给定串建 ACAM 然后 DP 即可解决问题。
进一步注意到合法字符串数量很小,当
ARC179D
当根固定时,我们希望一个一个子树走,记
这个 DP 很容易做换根,做完了。
P4119
离散化对值域分块,常见做法是先求出答案在哪一块,然后对这一块内每个点求区间内出现次数。后面的部分,区间内出现次数可以分块维护。前面的部分,对每一个值域内的块在原序列上也分块,维护每个块和之前的出现次数总和,每一块再维护一个并查集就可以了。
ARC150D
限制只随机到某些点不好处理,假设会随机选到所有点,但是选到那些点时不计算贡献即可。
根据期望线性性,只需要对于每个
对于每个点
考虑这条链的答案,则初始时没有好的点,假设点
CF1031E
限制很紧,肯定是希望每次至少能删
CF776G
显然
枚举
CF1535F
忽略不能转化的条件,则答案至多为
枚举其中有序的那个串,比如是
建出正串和反串的字典树就变成两棵树的两个子树交,由于权值是排列所以是二维数点问题,扫描线即可。
数论题
考虑什么样的
可以发现很多时候
对这些特定的
CF2068K
考虑一个暴力的模型:首先将
直接加虚点的复杂度和答案大小有关,无法通过。
注意到我们可以只建立部分虚点,具体地,每次取最小的需要建立虚点的时刻
可以证明复杂度为
CF2068H
把这个相邻两项曼哈顿距离补全成环,记
不难发现有解的两个必要条件:
与 同奇偶,即 为偶数。 。即 。进一步地,对于所有 都有 ,意义是直接走的距离总是不超过绕一圈的距离。
事实上这是充要条件。考虑给出归纳性证明。
对于目前的终点
考虑条件
对于条件
事实上我们可以证明取
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现