2024.9.6 近期练习
P5044 [IOI2018] meetings 会议
对于
很显然已经有一个莫队算法,支持区间加,区间查询即可。然而不优。
其实单调栈与笛卡尔树是相似的,考虑建出笛卡尔树。
我们假设就对
右边取址同理,设
具体地,把
转移方程里有
这样的话,lca 下每个点都只有一侧是被
考虑怎么维护
这样,我们需要支持区间加等差数列的,还要有区间 checkmin 的线段树。
checkmin 是可以换成推平的,不难观察到
P10430 [JOISC 2024 Day1] 鱼 3
我们相当于选出一个
由于对于固定左端点,右端点的答案是可以增量的维护出来的,所以我们递推右端点做扫描线。
对于加入的一个右端点,我们从后往前扫,使得前面都变成递增,这么做的话复杂度是
我们要考虑找性质进行优化。
不难发现,若一个位置减少,导致其前一个位置减少,那么他们以后都会一起减少。
我们可以用并查集把这些同时发生改变的并起来。然后接下来的处理用线段树维护区间和即可。
P2605 [ZJOI2010] 基站选址
你可以求出每个村庄被覆盖,哪些村庄放基站即可做到,那么这是一些区间。
然后我们再设计一个 dp,
假设从
对于左端点
考虑用线段树维护 dp 过程,线段树维护每个
考虑 dp 从
对于一个区间
P9546 [湖北省选模拟 2023] 山路长环 / ring
我们先思考一个问题就是什么时候先手会必胜或必败。
先考虑链的情况。简化问题变为只有两条边,如果初始在边上两个点就是无论如何必败,中间必胜。
所以如果是三个边,分讨中间点和边上点的话,无论如何必胜;
如果四条边呢?如果在边上,第一个点和第三个点都是必败态,这与两条边形式相同,所以必败。
后面同理。所以我们得出,一条链的胜负态只与奇偶性有关。
如果是环呢?如何环的大小为奇数,那么先手直接断一条边就赢了;为偶数,谁先断边就输了。
那么双方的操作肯定都是把边减成
这个直接用线段树维护,秒了。
CF516D
先取出
于是我们考虑每个子树维护其子树内最大值为某数时的最大连通块数。
因为根节点的
由于最大值越大,答案越大。同时我们可以把已经不满足条件的最大值弹掉。
所以我们相当于每个点有一个单调队列状物。
还有一种计算贡献的方式是一个点二分出其能贡献到祖先的哪个,直接加上去即可(拆贡献)。
CF1740H MEX Tree Manipulation
观察到,一个点 MEX 值为
我初始的想法是直接暴力往上跳更新。因为一个点只会被更新
然而这是错的,因为每个点的 MEX 值不是一直增加的,而是有可能降低。
因为值很小,把值放进状态里。考虑 ddp,使用树链剖分,维护每个点的轻儿子的答案。
我们要维护设
这个是可以用线段树区间维护的。同时维护一个
考虑更新了一个点轻儿子怎么做,每个点维护其每个值的儿子的个数即可。
这么做是
但是你向一个集合里插入一个值求
CF571D Campus
离线。先把两个并查集形成的树建出来,对于一个点的所有儿子,先合并的边排在 dfs 序的前面。
这样子做,所有操作都是对应树的区间操作。
对于一个单点查询,我们考虑在树
以及在树
对于树
那么,把区间操作差分,递推下标这一维,主席树维护每个时刻的操作。
最后,我们递推时间这一维,对于树
有话要说:维护时间、值这一二维平面,我们对于树
递推时间是常见的,递推下标维护时间还可以想到 P3863。
CF1582F2
由于
状态数为
当我们插入每个
因为一个点取值只有可行和不可行,当我们已经转移过一遍,现在就无需再转移一遍了。
所以,我们对于每个
同时,因为
这样的话,可以做到每个状态只被转移一次。
CF1400G
拆贡献,枚举最后区间的人数,设为
现在有敌对关系,需要容斥掉。由于
枚举
对于
P8859 冒泡排序
对于 type1 的操作,我们先考虑如何计算最少操作数。
把数从大到小插入,如果一个数插入在第一位,那么是不贡献的;反之有
不妨设
现在考虑 type2 是一个环。那么你要求的就是所有循环同构的排列中最小值为
这非常难处理。所以我们改一下条件,上述贡献为
我们要求所有以某位置开头,绕一圈形成的排列,前缀最大值最多有
因为我们要计数一个环排列,所以我们得钦定一个位置。
如果钦定最后一位是
我们联想到笛卡尔树之类的结构。
所有后缀的前缀最大值最多是笛卡尔树上一条到根的链最多的向左走的边数。称为“左链”的长度。
所以我们考虑笛卡尔树来做一个 dp。对于一个区间,我们枚举其最大值的位置,分成两个小区间。
因为
所以我们设
复杂度
ARC148E ≥ K
我们看到这种限制可以类比 CF1842H Tenzing and Random Real Numbers。
那么我们把每个点都乘上
所以现在我们考虑按照绝对值从大到小排序插入。负数插在两个正数间,同时保证负数不会相邻即可。
设当前插入是负数,有
设当前插入的是正数,那么每插入一个就是多一个可用的位置,插板法,贡献
我们维护的是像这样 “边界-s-正-负-正-s-正-s-边界” 这种结构。
初始时候
我一开始打算用的是插入 dp。因为我以为插入正数可以合并两个段或接在一个段后面。
但是其实上述两种情况是不存在的,因为这两种情况都重复计数,只要两个正数段之间不插数即可。
P6596 How Many of Them
很容易想到一个 dp 设
计数 dp 需要“围绕基准点构造一个整体”,选
当我们去掉了
计算
若形成了
那么计算
还有
现在我们求
那么
P5616 [MtOI2019] 恶魔之树
把每个质因数的贡献拆开是错的,因为这样乘起来可能会出现一个位置同时被钦定选与不选。
换句话说,每个质数的贡献不是独立的。
那么,我们考虑 dp。那么,我们需要把所有质因数的状态放进状态里,但是这样复杂度将会炸裂。
注意到,对于每个
我们考虑先计算只有
dp,每次加入若干个相同的数
对于最大质因数
我们逐一加入
初始的时候,大质数的积的和的值就是一开始的
如果当前加入了一个数
最后到下一个
为什么小质数不能逐个加入呢?因为一个数可能有多个小的质因数,而这些质因数的状态又得要记录。
大质因数,只需要记录一个状态就行了,因为这有这一个状态会受影响。 可以说大质数是两两独立。
CF512D Fox And Travelling
如果有环,那么里面的点是无法被选择的。
所以我们考虑树,我们相当于每次选一个叶子删掉。我们可以钦定一个根最后选择,然后做树上背包。
一棵树里最多有一个点是跟某个环有边,其一定是最后才能选。那么我们直接钦定这个点为根。
但是如果没有这样的点会导致算重复。我们如果枚举每个点令其最后选呢?
虽然钦定的这个点将会最后选,但是一棵树不一定选完,怎么办呢?
假设我们选了
最后,每棵树都是独立的,最后可以再做一下 dp。
关于如何才能把树给找出来,可以采用拓扑排序,每次删度数为
P8321 『JROI-4』沈阳大街 2
考虑把
dp,设
转移假设是
那么状态数有一点大,怎么办呢?注意到,如果是
所以,
P7116 [NOIP2020] 微信步数
我们把每个维度拆开后,我们要求的是第一个到达边界的维度花了多少步。
这启示我们需要拆贡献,我们想要计算每个维度第一个到边界的方案数与贡献。
如果我们枚举这个维度是多少步到达的,然后计算其他维度在这个时间不能到达的位置数乘起来即可。
考虑每个维度预处理出
如果
考虑
注意到,每个位置的答案的周期,是一个时间周期内的位移,周期之间每个答案的差相等且
前面
我们枚举当前维度的周期每个位置,随着经过的周期数增加,另外的周期可用位置数是均匀减少的。
这是一个多项式形式的贡献,考虑插值出来即可,细节应该很多。
AGC043C Giant Graph
由于权值的特殊形式,我们相当于要把
我们可以看做是从
每条维度分开讨论,考虑把点从小连到大形成一个 DAG,那么讨论每个点的选择情况。
若一个点所有出边存在一个被选,那么就不选;否则就选。
这和博弈转移的形式相同,被选的点就是必败点;不被选的点相当于必胜点。答案是必败点的权值和。
现在把三个维度组合起来,要使用 SG 函数了。计算
因为
P7519 [省选联考 2021 A/B 卷] 滚榜
限制是对于第
注意我们计算的是
所以我们考虑对于每种排列,设计一种
假设当前加入第
其中第二个比较相同的情况要考虑编号大小。
那么设
考虑枚举下一个选什么来转移,复杂度
我们考虑减掉一维,如果删掉
把
于是我们考虑费用提前计算,
这样状态数
最后我们发现还有
P7914 [CSP-S 2021] 括号序列
由题目的数据范围猜测做法应该是区间 dp。
我突然想说一句话,所谓 dp,就是每次遵循一定的规则把任务划分成子任务,而这就叫转移。
我们对于一个区间,思考其究竟如何转移而来。
区间的组合形式有这些:A+A,A+SA,(A),(A+S),(S+A)。
前面两种,考虑枚举其第一个位置使得可以跟左端点构成的区间的匹配,分成子任务计算。
后三者,只是进行了外面套一个括号的操作,只需要计算
一个合法的区间,必须满足左右两端各有左括号和右括号。因为 A 一定是括号括起来的,
所以我们去求 A 的方案数,然后呢再向左、向右扫,计算 SA,AS 的答案。
一个问题:我们要保证枚举出来的第一个位置与左端点是一个括号套起来的,所以还要记录一个数组。
初始条件的话,考虑把所有 (S)和 ()这种先拿出来,他们无法再拆分。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2023-09-07 2023.9.7 Online test