洛谷 2024 秋令营
10/01
洛谷集训 Day 1.
秋假过得太摆了,今天写完作文要自律了。
单调数据结构
CF280B
有最大值,可以想哪里是最大值,钦定一下。
但次大值太多了,于是变成枚举次大值。直接单调栈维护最大值在哪里就行了。
总结:如果涉及最值,就可以考虑最值的位置。其实和笛卡尔树是相通的。
CF1407D
第一种情况太 naive 了。
第二三种有 \(\max\),于是可以先分讨 \(h_i, h_j\) 的大小关系。
分讨完直接就是个单调栈的形式了。弹栈的时候进行一个 dp 的转移。
ABC352D
超级大水题,一眼秒掉。
唯一的好处是发现用 set
做滑动窗口应该码量很小!
CF1195E
一眼秒二维单调队列。
贪心
可以每一步最优(归纳法)或 exchange argument(交换就不优了)。
P1080 国王游戏
我觉得高精度比贪心难。
ABC236F
贪心 + 线性基维护不难想。
证明的话,如果能被异或出来,肯定不加;否则异或有自反性,如果能插还不插一定亏了。
CF1552E
\(\lceil n / (k - 1) \rceil\) 是抽屉原理。然后讲一个不是抽屉的做法???
好吧,还是抽屉。每次构造 \(k - 1\) 个互不相交的区间,这样只有 \(\lceil n / (k - 1) \rceil\) 层,刚刚好。
证明可以归纳。
感觉还是有点困难。
倍增
自底向下,翻倍扩大。
两种典型的倍增:跳步型倍增,结构清晰,典例是倍增 LCA;拆分型倍增,经常是二进制拆分 / 按位贪心,典例是 ST 表。
CF1142B
不难。
注意到循环匹配就是跳到下一个,于是这就可以倍增跳(到这里已经可以,但实际上就是树的 \(m\) 级祖先,直接做即可)。
然后我们看一下跳到哪里才够深度为 \(m\),ST 表区间查询即可(由于 \(need_i \ge i\),所以这也不用,直接后缀 \(\min\) 即可)。
%%% \(\textsf{S\red{Serxhs}}\) %%%
CF932D
题意翻成人话:动态加叶子,有点权,求到根的路径上,点权如果能不减就必须选个点,且和 \(\le X\) 的最长的链。
并不是非常难。
CF1848F
第一肯定有解,第二变成 \(0\) 后就不变了,因此倍增到 \(0\) 就可以更小。
分治
THUPC2021 线段树
感觉讲得和代码完全不一样?
是这样的,考虑每个节点的儿孙们的贡献,于是就有了分治的做法。
感觉说不清楚,看题解去。
CF1045G
先按照视野排序,这样只用管视野小看视野大的了。
算了好像后面忘记听了(
10/02
模拟赛 #1. \(100+60+0+0=160\),B 的大模拟写吐了,以至于 200 都没上/ll
10/06 和 10/13 我要 200+pts!/fendou
数据其实有点弱,我的复杂度不对的多源洪水填充都没 T,正确写法是一次性全加进去,怎么我这都忘记了!
大模拟最好到最后写。这把被打磨光滑了……
听 C 的时候学到了一个 DP 考虑方法:DP 就是有向无环图,于是就有了倒着做这样的优化。而这题的特征是终点不变,起点在变,于是就可以倒过来了。
D 题的 DP 优化是只关心差值的话不用记具体数值,记差值就行了。另外一个 shuffle
的技巧是真的没见过……
10/03
昨天的题不太想补,就写了个大模拟,竟然 1h 一遍过。
大模拟,需要头脑冷静,不急不躁,想明白程序结构,尽量做好模块化。最好最后写。
由于不想补题,于是搞了个 ABC373G 看看,学到调整法。
数据结构。
二叉堆
超级钢琴
早就做了。
P10977
朴素 \(O(n^2)\) DP 不难。
注意到 \(\forall i < j, dp_i \le dp_j\)。因为把 \(j\) 的方案放到 \(i\) 一定不增。(感觉这个性质的观察太玄学了)
于是,我们就要考虑 成为后缀最大值的下标 所在的 DP 状态这些决策点。
这不就是单调队列吗?维护单调队列里的值形成的堆即可,不过要可删。
并查集
P10350 PA2024
好难啊/fad
抽象,不好说,自己写了看代码去。
P9565 SDCPC2023
与其实就是要某一位全是 \(1\),这不由得让我们想到并查集。
于是太简单了。把 \(V\) 的某个 \(0\) 位改成 \(1\),或 \(V\),以这个中的某个为前缀的边的路径肯定可以的,直接并查集维护。
哎呀太难表述了,自己看代码去。
P8026 ONTAK2015
很明显是要每个图里两个点的并查集祖先相同,怎么快速判断?
——哈希。
为了避免哈希修改次数过多,并查集采用启发式合并。哈希值用个什么 STL 即可。
树状数组 & 线段树
P3801
简单题,维护行列操作奇偶性。
P7764 COCI2016-2017 #5
\莫队/\莫队/\莫队/\莫队/\莫队/
扫描线,可以把之前的变成负数,这样刚好贡献抵消。但肯定没莫队无脑又好写!
P9561 SDCPC2023
套路的扫描线,然后似懂非懂……
感觉还是听懂了,下一题大概就不会了……
P5524 Ynoi2012
一不留神电脑卡忘记听了……
Trie
P2536 AHOI2005
字典树上走啊走,* 走子树 ? 走儿子。
dfs + 记忆化。
P9694 GDCPC2023
就,一层一层往下走,看看能不能走,有点类似线段树分治的感觉,不过是棵 Trie。
不难。
P7537 COCI2016-2017 #4
大水题。
倒过来插,题意要求 Trie 上最长连续段,随便树形 DP。
押韵的条件是父子或兄弟。
10/04
图论。
LCA
P4281 AHOI2008
大水题。
直径
实际上,路径按照 LCA 分类是不要太常用的方法。
P6845 CEOI2019
先明确一下我们在求啥:\(\max_{u, v} d_u + d_v - 2d_{lca(u, v)}\)。
对于 \(u, v\),LCA 在欧拉序的中间,于是原式等价于 \(\max_{u, v}(d_u + d_v - 2 \min_{w \in [u, v]} d_w\)。(差不多这个意思)
最短路
P6190 NOI Online #1
\(n = 100\) 提示矩阵乘法。(不止是提示 Floyd)
可以用 \(c_{i, j} = \min_{k = 1}^n a_{i, k} + b_{k, j}\) 的矩阵刻画最短路。
答案肯定是一段最短路加个负权边,然后就是搞矩阵乘法。
P1266
这题好怪啊,速度怎么这么小?(难道开车速度上天?)
于是就可以化动态边权为静态,每个点拆出 \(500\) 个来建边,直接 Game Over。
拆点 / 分层增加维护的信息。这样的操作是和 DP 相通的。
P2149 SDOI2009
怎么还不如以前,以前我可是独立切这题的!(好像吧
不过这题有点思维难度,当时也做了很久。
P7624 AHOI2021 Junior
做过。省选班题。
突然悟了为什么找负环要先往前跳 \(n\) 次,因为要确保在负环上。不然可能是这样的(我们 Bellman-Ford 按照边的顺序来松弛)
3 4 -1
1 2 -1
2 3 -1
3 1 -1
这样我们会发现 \(3\) 还能松弛 \(4\),但 \(3-4\) 不在负环上。
类似这样。
连通性问题
P3825 NOI2017
对于 \(x\) 类,只要枚举其为 A / B 就行了,这样覆盖了所有赛车选择。
剩下就是个 2-SAT。
P5058 ZJOI2004
第一是个圆方树板子题。
然后可以神秘搞一下 Tarjan,达到判断一个割点是否切了 \(A-B\) 的效果。
以 \(A\) 为根做 Tarjan。如果我们通过 \(u\) 与其儿子 \(v\) 判断出 \(u\) 是一个割点,仅当 \(B\) 是 \(v\) 子树内的点才能判定 \(u\) 把 \(A-B\) 切了。
P7737 NOI2021
题意就是,连向同一个点 \(v\) 的点的导出子图是竞赛图。
于是我们就可以简化边,只留下拓扑序最大的往 \(v\) 连就行了。
转化后变成了一棵叶向树。
之后就可以用虚树之类的方法搞搞搞,搞完了。其实是没怎么听懂😛
欧拉回路
P3520 POI2011
首先转化成异或,这种「改变状态」转化成异或显然。
之后画几个图发现一条边只会经过一次,因为如果我们经过了一条边超过 \(2\) 次,我们可以把它被两次经过的环并一下,跳过这个边,于是清洁情况不变的都不管。然后就是欧拉回路 + 把回路拆成环。
10/05
DP。
做 DP 有很多难点……
-
发现 DP
-
设计 DP
-
这咋优化?
-
Many many attemps... Many many WAs...
P3537 POI2012
先考虑瞎搞,把满足条件的物品拿出来跑背包。
背包里只有 \(0/1\),这信息量也太低了,于是……
我们把 \(0/1\) 换成 \(\max a\),使其最小。然后离线并按照 \(m+s\) 排序,物品按照 \(b\) 排序,于是扫几下就完了。
启发:DP 状态多存信息,有利于优化。
CF744C
状压太明显了。然后我们发现不知道怎么设计状态转移。
于是按照需求搞状态,我们要轮数,可以由搞钱次数算出来,就是红的领了多少。
同时搞红和蓝不好搞,于是记下一个。这样 \(f(S, i)\) 表示买 \(S\) 用 \(i\) 的红宝石就可以转移。
\(i\) 的最大值太大了,接近 \(\sum r\),但省的钱也可以用来推断买多少,最后推出答案了。
于是 \(O(2^n n^2)\),可以通过。
DP 可能需要一些优化,这时可以先想如何转移,不管复杂度之类的东西。
P1758 NOI2009
转化为两人取珠子,取出来的一样。这样刚好 \(\sum a^2\)。
然后 DP 就先 \(dp_{i, j, x, y}\),\(O(n^4)\) 转化到 \(O(n^3)\) 太简单了,\(y\) 可以轻松压掉。
启发:用组合意义进行转化。
P7519 UnitedPS 2021 A/B
一通操作先搞出来个 \(f(S, i, last \ b, \sum b)\),这样 \(O(2^n n^2 m^2)\)。
这样是一条一条“竖着”确定。然而 \(b\) 是不减的,因此还能“横着”确定。
就是本来是个 \(b\),现在变成了 \(\Delta b\)。
这样上一个就没关系了啊,直接变成 \(f(S, i, \sum b)\) 就优化完毕了。
P3244 HNOI2015
直接来个 DAG 还好做,就是
\(deg\) 是入度,就是随便选个父亲。
那环怎么做?
先还是原来那个式子,肯定算重复了!于是我们要去重!
去重肯定是选了个环(老师注意力惊人),于是当 \((x,y)\) 返祖时,从 \(y\) 到 \(x\) 拓扑一遍即可。公式:
其中初值是
这里 DP 是题目中的一个辅助工具。
P3577 POI2014
距离小于等于 \(10\) 个节点,让人联想到一些状压。
无向图的 DP,可以考虑 DFS 生成树,其特征是没有横叉边。
由题性质,其深度 \(\le 10\),于是把祖先的状态 \(3\) 进制状压下来(选了 / 没选被覆盖 / 没选没被覆盖)。
实现的话要 \(dp(n, S)\),空间可能炸了。但我们是一路 DFS 下去的,于是只要管一条到祖先的链,不过 \(10\) 个点就行了。
对于图上问题,生成树是简化处理的好方法。这样就成为树形 DP 了。
P3226 HNOI2012
把性质画出来,发现成了几张表,不能选相邻的数。
每张表横着 \(\times 2\),竖着 \(\times 3\),这样大小是 \(\log n\) 的。于是随便状压就过了。
P9676 ICPC2022 Jinan R
搞个暴力状态 \(dp(day, 今日练习内容, 没练天数 \ 1, 没练天数 \ 2)\)。这样高达 \(O(n^3)\),过不了。
然而这个熟练度变没机制很特殊,是 \(O(x^2)\) 的。于是分析一下发现这人肯定不想白练。于是只能有 \(O(\sqrt{\max V})\) 天不练。于是最后就成了 \(O(n \max V)\)。
10/06
AB 都是 sb 题,但 B 做完了观察跑偏了方向浪费了时间,于是同样不难的 C 也没做。D 好难结果想好久。
结论:
-
D 只打暴力!
-
要学会预处理优化!
-
原来我不会树形 DP!
-
不要觉得题目是不可做的!
10/07
最迷糊的一集。
数论
P4588 TJOI2018
不是线段树的做法:
记 \(m = ab, (b, M) = 1\)。
则 \(b\) 好做,直接 \(b^{\varphi(m) - 1}\) 乘上去。
\(a\) 的质因子都是 \(M\) 的质因子,于是维护以下就行了。
P8457 弱化版
什么人类智慧。
尝试 \(x \equiv n (mod \ p)\),于是 \(x^x = n^x\),之后的方程是好做的。
组合数学
错排还是先记一下:\(D(n) = (n - 1)(D(n - 1) + D(n - 2)) = nD(n - 1) + (-1)^n\)。
卡特兰数与折线容斥:\(C(n) = \binom{2n}{n} - \binom{2n}{n - 1}\)。
容斥原理。
二项式反演:
对于 \(f(n), g(n)\) 满足
则
一般 \(f(n)\) 是至少满足 \(n\) 个条件,\(g(n)\) 是刚刚好。不懂。
ABC266G
把 RG
看成新物品,于是就先把 R, B, K 放完。最后 G 是插板法。
我们要避免又变出来 RG
,于是先避开最后加。
至少 \(c\) 个 RG
好做。
于是二项式反演即可。一般对于“至少”与恰好,二项式反演都是成立的。
剩下的根本听不懂。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探