洛谷 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 还好做,就是

\[\prod deg_u \]

\(deg\) 是入度,就是随便选个父亲。


那环怎么做?

先还是原来那个式子,肯定算重复了!于是我们要去重!

去重肯定是选了个环(老师注意力惊人),于是当 \((x,y)\) 返祖时,从 \(y\)\(x\) 拓扑一遍即可。公式:

\[dp_u = \sum_{(fa, u) \in E} dp_{fa} / deg_u \]

其中初值是

\[dp_y = \frac{\prod deg_u}{deg_y} \]

这里 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 好难结果想好久。

结论:

  1. D 只打暴力!

  2. 要学会预处理优化!

  3. 原来我不会树形 DP!

  4. 不要觉得题目是不可做的!

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(i) = \sum_{k = i}^n \binom{k}{i} g(k) \]

\[g(i) = \sum_{k = i}^n (-1)^{k - i}\binom{k}{i} f(k) \]

一般 \(f(n)\) 是至少满足 \(n\) 个条件,\(g(n)\) 是刚刚好。不懂。

image

ABC266G

RG 看成新物品,于是就先把 R, B, K 放完。最后 G 是插板法。

我们要避免又变出来 RG,于是先避开最后加。


至少 \(c\)RG 好做。

于是二项式反演即可。一般对于“至少”与恰好,二项式反演都是成立的。


剩下的根本听不懂。

posted @   sihiazi  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示