「September」做题笔记
直接二分答案。我们试图夹逼出一个范围。和那个什么题一样。
可以得出
仿照二维情况将曼哈顿距离转化成切比雪夫距离的方式。我们令
所以我们得到了
check 的时候先贪心将
实现的时候需要注意
可以列出一个二维 dp,但是好像优化不了。
你感受一下,这个值就等于扩展的个数,这个条件很重要。
发现如果我们扩展了
直接 bitset 优化即可。
如果两个数不会撞在一起,答案就是
由于撞在一起的数只能是相邻的,而且这两个数相同就停止撞的过程,并且不影响其他数对。
所以根据期望的线性性质,考虑相邻两队即可。设
然后你发现多个数对可以用一个 dp 处理,所以总复杂度也是
一点思路都没有。正解是随机化。
考虑
贪心选取
由于
证明不会,感受一下可以感觉到
原来
考虑如何翻译出这个 “染黑所有格子”。可以化简一下答案等于
答案为
上面那个不对,选了
所以答案为
斐波那契的生成函数是
将右边的式子化简为
由于
所以答案就是
容斥。
暴力卷积
右边那一坨有个
CF1863F Divide, XOR, and Conquer
有小丑把 xor 看成或了。可想那一场我是多想睡觉。这个题最多 1800 分吧。🤡
考虑一段区间的异或和,起决定性因素的肯定是最高位。
对于左端点是
用区间dp的顺序给一个点打一个两元标记即可。
咕咕咕。
非常难崩,刚好是今天模拟赛 T1 的 trick,那个题我没切掉。(
如果没有依赖按照
有依赖会出现可能当前这个点不应该选,但是加上子树会选,所以我们不妨从叶子开始考虑。
我们将
事实上也并不需要大众说的可删堆/set,直接判断这个点和父亲是否在一个连通块里面即可。因为选的是
这个题不好说,建议看代码,很好懂的。https://atcoder.jp/contests/agc023/submissions/45265741
容易想到答案下界是
手玩一下发现同构的充要条件是以中心为根,每个深度相等的点的度数相等,所以答案就是
由于可以增加节点,一个点或者一条边都可以成为中心,所以枚举一下再计算,时间复杂度
这种 trick 都被出烂了,大家一起复古。
观察这个方程,可以得到最远处的
由此我们设置前两行和第一列作为主元,根据这个方程直接递推得到系数。
然后最下面两行和最右边一列可以作为方程,所以
wqs 板,精度要开
注意到答案的形式是先往左边走,再掉头走右边的情况,另一种可以翻转做。
右端点向右移的时候,左端点一定不会向左移。直接决策单调性就好了。
当时好像是 Freopen(?)给新大一(?)讲过这个题,当时为什么我没听懂?
先对
问题转化为求一个最长的区间满足
可以维护出一个以
所以线段树找出区间左边第一个小于等于某个数的位置即可。
注意答案区间不能越过两个相等的数,并且
按机器出现时间从小到大排序。
🤡。
令
选择会场
选择会场
答案就是
上面那个dp的设置和转移复杂度已经卡满,故第二问不能再枚举。
设
这是个卷积形式,可以设
然后你发现
时间复杂度:
[AGC024E] Sequence Growing Hard
p.s. 洛谷上对于这个做法(
这个题完全评得上 *3000。
可以转化成构造
可以看成一个插入 dp,时间复杂度大概是
请注意,本题求的是 本质不同序列的个数 而不是 插入的方案数。如果存在相同的连续段,插入第一个数的时候肯定要
我们考虑从小到大插入数字,令
即可。
斯坦纳树。
思想是按照状态作为dp的顺序,我本应该要意识到这一点的。令
[AGC024F] Simple Subsequence Problem
考虑我们判断是不是子序列的过程,对于匹配串
记
发现
直接 dp 就好了。具体实现有点细节。
「2020-2021 集训队作业」Communication Network
喵喵题。
这个严格交不好整啊,直接子集反演。子集反演就是
prufer 序列的经典结论,所以
直接 dp 即可。时间复杂度
[ABC240Ex] Sequence of Substrings
一个重要的观察是
直接把这个字符串提出来排序,再树状数组优化 dp 即可。
时间复杂度
自然想到按横坐标排序后对区间考虑,但是如果 dp 记录最长长度和,我们并不知道现在的时间。
考虑 费用提前计算。记
转移就是枚举当前是否被消成
时间复杂度:
[ABC252Ex] K-th beautiful Necklace
因为相同的数可以算两次所以线性基不行。
范围非常搜索,直接折半搜索,在外面套一个二分,然后 trie 查找即可。
发现复杂度最高在把
二分太冗了。直接填答案,把所有状态对应的 trie 节点同时考虑,判断同向节点和是否足够,足够就填
上面那个有点问题,如果一个颜色同时在两边,这个数提供的贡献不是出现次数而是出现次数加
[AGC040E] Prefix Suffix Addition
如果只有操作
统计
将
把 dp 式子写出来,发现是个关于
等能力提升来写代码。
[AGC061C] First Come First Serve
最直观的答案是
考虑上面那个的充要条件,由于
发现如果多个数不合法,它们的
注意乘的系数是
感觉这个题很套路。
可以想到一个 naive 的 dp,枚举这个点所以的段,统计点对,背包做到
重复计算了很多,可以左右都跑一遍前缀和,再二维 FFT,时间复杂度
好像不能退背包,考虑对序列二分,直接 cdq 那样,具体我不想写了,时间复杂度
我觉得这个题不简单啊。
考虑两个点对在第二个区间的端点处产生贡献。发现一个区间能产生贡献的只有
两个区间有交且大于等于
答案即为
bitset 优化匈牙利做到
[AGC040E] Prefix Suffix Addition
喵喵题。
首先可以写出暴力
观察一下,发现
这提醒我们维护两个分界点和最小的 dp 值。
就这样,可以把式子写出来推转移,这里略去了,因为我也没怎么搞清楚。
当然更容易的实现方式是二分出下一个分界点。
这个题有很多做法。
首先可以观察到
其中一个做法是观察图形,发现我们可以把最上面一行转到副对角线,再转到最下面一行。
这个题咕了,我到时候再来写。
【这个题待补】
如果只有一组询问,我们二分,跑最短路即可。
复杂度瓶颈在每次冗余地跑最短路,所以整体二分即可。
时间复杂度
两两分组,比较一次出最小值和最大值。然后最小值和最大值互相比较即可。
次数是
建出 kruskal 重构树找 lca 即可。问题在于怎么建出这棵树。
发现我们 bfs 即可。
首先可以证明如果我们确定了顺序,这个过程是没有后效性的。
但是有问题,换一个角度,如果
考虑这其实是一个对无向图定向的过程。我们贪心地从小到大考虑,从这个点向儿子定向,然后继续递归定向。因为考虑这个点儿子的儿子,如果它与这个点没连边,那么交换儿子和儿子的儿子,儿子的儿子就会与这个点交换一定不优。如果它与这个点连边,由于我们 dfs 的过程是从小到大枚举的出点,所以一定是更优的。
注意不能用 bfs,因为注意到上面有连边的情况,画画图就知道了。
考场上拼算法+乱贪心获得了 90 pts 的好成绩。(
容易猜到答案就是
考虑前缀和排序后差分,发现分组的情况就可以是这个差分数组。
注意要加入
暴力
有个关键的观察是这个题可以来回跳,所以跟奇偶有关。
考虑只连同色边,发现如果是二分图就保留生成树,否则保留生成树再多个奇环即可。
异色边同理,只保留生成树。
时间复杂度:
这也太难想到了吧。
考虑将图二分图染色。那么一次操作就会变成交换两个数的颜色。(其实这样构造还是和奇偶有关)
所以我们将奇数层设置为
如果原图是树,还是不难猜到答案就是
如果有环,考虑 dfs 树,再处理这条边(设其为
如果是偶环,奇偶不变,所以
考虑这条边的流量是
否则奇偶改变,就是同时将两个同色的节点改变。所以这个时候
如果你把
可以看我实现:https://atcoder.jp/contests/agc004/submissions/45706596。
依次将边定向,如果
证明可以自己画一下图。不理解就去看 uoj 的题解。
我能场上秒掉 AT *2600,甚至做题能10min切 *3000,但是 CF 切不了 *1900 和 *2100, 我还是状态选手啊!!!
考虑
https://atcoder.jp/contests/arc165/submissions/45718370
本来这个题也可以再想想的,被 CSBZR
搞心态了。
和 [PKUWC2018] 猎人杀 很像的转化,我们统计所有排列,如果当前数所在连通块大小
其实没想到上面那个也没有关系,根据期望的线性性质,我们可以统计子树
时间复杂度
中间那一段翻转了要与两边接起来,且这三段都是交错段。
直接找出极长的三段连续段的最大值即可。
直接对关键点和起点终点进行连边,其中行相邻和列相邻连边,注意拆点,跑最短路即可。
前置知识是二分图博弈,可以看一下这个题。[JSOI2009] 游戏。
所以如果没有边权的限制,那么后手必胜。我们猜测在这个问题中也是后手必胜。
如果
稳定婚姻问题的时间复杂度是
正着做倒着做好像都不是很行。瓶颈在于 I
的含义有两个。
直接二分,这样你就会发现倒着贪心是对的。OI
没到阈值 I
就一直放在底部。
就你数据水是吧。令
当时场上我是遇到环直接 return,加一些判断,数据水竟然过了!这直接导致了联合省选 2023 D2T1 我成为了历史。(
正解不是很容易想到啊。考虑用 dijkstra 维护这个过程。
[省选联考 2020 B 卷] 丁香之路 跟这个题思路好像差不多,但那个题我花了很久切掉了,这个题又不会了。
手玩后可以发现若
考虑
即
奇数的话拆成
设置一个 dp 一定要反复推敲它的意义!
不考虑位置的限制就设
加入这个前缀和,发现这两个限制是有联系的,都是对下标的限制。我们就可以像数位 dp 那样按位来 dp 就好了。
事实上这种思想我初三的时候就把类似的题切掉了,现在不会做了,证明现在学傻了。😟
[AGC061D] Almost Multiplication Table
没有战歌啊,根本燃不起来。😓
值域很大,但这个题的复杂度显然和值域有关。
观察一下式子,乘积其实能让我们想到根号的东西。考虑先二分一个
发现这两个变量小的那个是根号级别。
不妨设
则对于
对于
解释一下就是设置偏序关系后只用在一种数处理一类偏序关系即可,因为这个贡献感觉一下是可以传递的,但是还是很玄学啊。
正确性显然,因为万能的调整法是不能被质疑的。
时间复杂度
感觉还是得往子序列自动机的方向思考。但是转移的关系都有
感觉不是 log 做法,也不是分块。
😓。题面能不能说点人话。
考虑每一个数
离线,考虑莫队,由于区间长度会变化,我们需要把所有数的信息存一下。想到根号分治,对于出现次数
具体实现就是发现出现次数
对排列求逆转化成将排列排序是 naive 的。
显然是 dp,下标是一直在变的,考虑把数放进状态里面。设
转移就是
有点不是很理解这个题。到时候来补。
这个题,,很难绷啊。我找个时间来补篇题解。
[ARC153C] ± Increasing Sequence
这个题我当时怎么会没切掉啊!加训!
先令序列为
若
正确性可以感觉一下,因为我是感觉选手。
[ARC153D] Sum of Sum of Digits
好熟悉的感觉,当时我好像补了这个题的。
考虑第
转移的话枚举当前的状态,发现
那就枚举上一层的状态和
所以复杂度是
[ARC164E] Segment-Tree Optimization
这个题还是很好的。
刚开始肯定是需要一个结论的,强势猜测:把所有的点离散化分成
然后考虑一个区间能到达叶子的个数似乎就是 [包含的最左边的叶子是右儿子] + [包含的最右边的叶子是左儿子]。
设
可能和题解实现有点不一样,tmd数组开小了,我还一直怀疑我的写法是错的。
https://atcoder.jp/contests/arc164/submissions/45791965
这个背景看起来很典。考虑用 dp 维护一个类似容斥的东西。但是既要维护这些人的状态,也要维护深度的状态,有点难搞。
一个经典的处理是容斥的状态不用保留,只用每次加的时候乘上容斥系数即可。所以
[ARC078F] Mole and Abandoned Mine
发现最后图的形式只会是一条链,每个点上挂一堆点。所以我们其实可以钦定一个点集挂在哪个点上。
可以设
观察这个形式,发现转化成保留比边权和最大要容易一些。
但是你会发现这两维的转移是一个相对独立的过程。所以可以分开做。
时间复杂度是
考虑将原始的
感受本题的特殊性,发现是在因数和倍数的背景下,考虑从数值/值域上优化。
首先可以把相同的
处理出
而预处理
这个题的思路很自然的,确实是道好题。
CF1540C2 Converging Array (Hard Version)
TMD,本来能切掉的,考试只做掉了 easy version。
如果
观察出那个结论后不难想到一个
考场上我已经观察除了
事实上,我们只用观察 相对的下界,也就是值域范围。不妨把式子写出来,若所有的
太小丑了!加训!加训!
想不出 polynomial 做法?有可能是直接「维护值域」。
想到一个朴素的 dp 是
看到绝对值函数,我们可以归纳法证明这个函数斜率递增。考虑这个函数转移的时候的变化。
令斜率为
发现是将
对应成 slope trick,就是把右边表示斜率为正的分界点直接删掉,再把最大的两个分界点
这个其实很好找,由于子树传上来斜率为
发现
考验智慧的。
发现跳跃次数只有
令
观察到如果第一层的段数大于
所以时间复杂度其实是
CF713C Sonya and Problem Wihtout a Legend
考虑维护这个函数。每次加入一个绝对值函数的时候,先加入两个点表示相对的斜率的变化。
要把最大的那个分界点删掉,表示删除了斜率为
一眼典,但发现是有向图。
发现一个重要性质是若存在一条
所以可以规约到无向图,找出形如
怎么最近这么下饭呢?/kk
这个有小数看起来很不好操作啊。但其实你会感觉到如果它们小数部分的排名确定,那么方案数也确定了。
所以直接枚举小数部分的排名,这样你发现值域被离散化成了
这个 dp 也是有细节的。注意到本题是环,这可不好搞。但倘若我们令最大的那一段为开头就变成线性了,因为这个段不会被包含。
所以我们 钦定最大的那一段以
令
细节是 dp 的顺序是「枚举以哪个位置作为开头」,因为如果你直接枚举状态和这一次选哪个数,遇到包含的情况会重复。 因为这个调了好久。(
最后将 dp 值的和除以
把式子写成求重复边的和子集容斥再二项式定理得到了对每条边考虑的傻逼式子望周知。
有点套路,设
如果固定一个边集,那么答案就是
所以 dp 就好了。时间复杂度
月末赶进度!传统艺能!急急急!!!
又来 ad-hoc
。
首先注意到并不用输出方案,可以想一点充分/必要条件。
观察得到两个相同的相邻数可以缩,进而发现
但是还不够,继续观察发现
就是说,每次可以少一对
所以翻译一下就是
其实这种缩情况再判断的情况比较常见的。
手玩代替证明了。
[AGC058D] Yet Another ABC String
我去年胡出了一种容斥做法,但是现在忘了。
一眼容斥。你可能会想容斥不合法子串的个数,但是会交叉啊!
所以想到容斥极长不合法子串的开头个数。极长的意思是把交叉的情况扩展。
先把 A
,B
,C
排好,方案数为
向里面插数。发现开头和中间插入不一样。
如果开头不插入,方案数是
如果开头不插入,方案数是
即可。所以容斥的东西是灵活的。
有点妙啊。这种题先找充分必要条件吧。
先给出一个结论:如果能找出两棵边集不交的生成树,那么 Bob 赢,否则 Alice 赢。这个结论倒是限制后手的。
必要性很显然,如果 Alice 断开了连接两个连通块的边,Bob 一定能找到一条边联结这两个连通块。
充分性的话,如果没有两棵边集不交的生成树,Bob 想必赢的局面一定是复制蓝边,存在两棵不同生成树。因为 Alice 先手,所以 Alice 可以仿照 Bob 的策略,那么 Alice 一定能找出一棵生成树。这时 Bob 找不出一棵完整的生成树。所以 Alice 必胜。
数据范围小,直接爆搜。
考场上打了 6k 的线段树分治+线段树。想的是一个一个加算贡献。
事实上可以不用这个线段树分治啊。
所以其实是有整体算贡献的思想的。多想想这类数据结构吧。
CF878E Numbers on the blackboard
事实上,有些题如果我们摒弃去研究冗杂的过程,而是整体观察性质或钦定一个顺序/全局贪心,会有不一样的感觉。
贪心有 70 pts,好!
事实上已经很接近正解了,如果不给我说这个题是*3300说不定可以做出来。 考虑贪心的过程是从后往前合并,如果后面的
如果我们从左往右扫右端点,会得到若干块。事实上左端点位于何处不影响这几个块的分布,所以直接对块前缀和再随便块内二分一下就好了。注意块内可以用 归纳法 证明是
事实上显然有
zxy 是用二叉树理解设计 dp,再观察到这个 dp 意义的。湘妹儿牛逼。
差点就做出来了啊!
如果出现一个拐角,那么会多一种情况。因为要这些数线性无关,所以拐角的个数要小于等于
翻译到序列上就是拐角的构成字母不能与其他拐角公用,贪心选即可。
讲得很抽象,看代码吧:https://atcoder.jp/contests/agc060/submissions/45991984
咕咕咕。
我是🕊️,我在填前面的巨坑。
根据连通图有
2*2
的小格和围成空格子连通块的数量。
第一种情况也是二维数点,第二种情况的出现当且仅当这个区间完全包含了河流,特判即可。
我是🕊️,我在填前面的巨坑。
这个
令
这提醒我们如果知道前
然后这个式子已经相对独立了。如果我们枚举
估计有点不好懂,可以看看代码:https://codeforces.com/contest/321/submission/225728173
初二省选考场乱搞 75 pts,乐死我了。
方程有
我尝试用这几个主元表示,得到的是形如
考虑先设这些主元都是
然后你会得到
直接 spfa 跑差分约束即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效