HNOI2021 前的训练记录
看来不发力是不行了……
upd:争取每晚更新一次。
3.16
考试
先看的 T2,想到一种网络流建模方法(具体类似文理分科),发现不好处理不能有集合为空集的情况,就弃疗了。
最后发现我竟然不会枚举!!1
其实发现 \(1\) 号节点分配到哪一个集合都不会影响答案,不妨钦定它到左边集合。
然后枚举哪一个节点一定在右边集合,跑最小割即可。
小 trick:把正常建图的 \(INF\) 设成 \(10^{11}\),钦定某个节点在哪个集合就把对应边的权值设成 \(10^{18}\),表示一定不能断,最后答案即为 \(\max\{INF\times n+\sum f_i- 最小割 \}\)。
T1 想了想 \(l=0\) 的分,发现是错的。
T3 爆搜 \(7\) 分。
以后要锻炼考试 4.5 个小时都在想题的习惯,少划水,合理利用好时间。
练习
落实了考试 T2。
做了做 文理分科,一个 NAIVE 的错误竟然和 Werner_Yin 一起对着题解找了 30min 才发现……
总结一下一般这种 选某个点有一种贡献、某些点一起选又会产生新的贡献 的题目的建图方法:

3.17
讲课
Itst《杂题选讲》。
题目难度都比较大,落实的话以后加把劲吧。
- 
一些考试技巧还是要磨炼,把每次模拟赛都当成正式考试去考。 
- 
不要贪切题,把每一档分拿稳才是最重要的;不到万不得已的时候尽量不选择激进。 
- 
时间分配非常重要,遇到什么意外不要乱了阵脚。 
- 
心态不要崩,相信什么时候都可以翻盘。 
练习
JOI 2020/2021 二次予選 A~C。
A 简单模拟 + 优化。
B 最短路建模,融合了很多 trick,难得的好题。
C 比较简单的 dp + upper_bound 应用。
D 是贪心,想不出只能看题解。其实贪心策略一开始想出来了一些眉目,实际上证明很巧妙,是一道典型的由部分分做法推出正解的题。有时间还是可以写下题解的。
3.18
考试
暴力场。。
T1 构造。50 分白送,写完稍微想了下觉得挺复杂就没去想正解了。
T2 本场考试最简单的一道题。考场上发现 50 分暴力模拟是白送的,就写完没管了。
T3 先写了 10 分的暴力,后来想了想 25 分的 \(v\) 都相等的情况,发现一直都会算重,最后毫无进展。
实际上 T2 可以转化为格路上的问题,然后单调队列维护。
T3 \(n\le 5000\) 的可以 dp,不算重的话可以枚举最小 border 解决;\(v\) 都相等的情况是分类讨论。正解是分治 FFT + 卡常。
T1 是最复杂的题目。
练习
JOI 2020/2021 二次予選 D - 安全点検 (Safety Inspection) 二分 + 贪心。
ABC195 E - Lucky 7 Battle dp 的思想,用记搜来实现。
ABC192 F - Potion 一道比较妙的题:
设选出了 \(cnt\) 个数,总和为 \(sum\),那么就有 \(X\equiv sum\bmod cnt\),我们的目标是让 \(\frac{X-sum}{cnt}\) 最小。枚举 \(cnt\),就要最大化满足上面这个条件的 \(sum\)。
考虑 \(dp_{i,j,k}\) 为前 \(i\) 个数,选了 \(k\) 个数,这 \(k\) 个数总和 \(\bmod cnt=j\) 的最大总和。
转移时考虑当前数 选/不选 即可。
理论复杂度 \(10^8\),但跑不满且 AtCoder 机子快所以能过。
给一下 参考代码。
3.19
考试
果然 SXYZ 的考试都是暴力场。。(而且每次 rk1 都是 zqy
今天暴力 \(6+60+22=88\),还算好。
T1 多剪一些枝还可以多 17 分。
T2 数据太水导致本机极限数据 3s 评测还能过,理论上只能过 30 分的。
T3 \(n\le 20\) 的 12 分没去打,写了菊花图 & \(w_i=1\) 的 22 分,不然就 rk1 了。
总体来说这次题目正解比较难,但暴力分给的有点多,区分度不够大。
练习
调了特别久。。最后取一个 \(\min\) 就过了。。
我的想法是直接计算答案 + 容斥。
先对于每行每列单独计算可以到的点数,有些点可能会计算两次答案,用一个树状数组减去这类贡献即可。
Code。
3.20
考试(JOISC2021 Day1)
开场 T1 先写了个状压,然后随便 random_shuffle 了 0.04 分(然而没什么用)。
开 T3,\(M=1\) 的点发现被卡科技了(不会吉司机线段树),没开 long long 7->2,遂自闭。
突然发现 T1 可以指定一个角度和起点爆搜,最后 50min rush 了 38 分。
38+0+2=40,不是很理想。
以后 IOI 赛制注意到了数据范围就先 #define int long long,被卡常再调整。
3.21
考试(JOISC2021 Day2)
发现 T2 得分率最高,就先开的 T2。
一个一个 Subtask 写过去,写完 1、2、3 后本来想写 4 的,写了个暴力分治 + 存前 \(k\) 小,后来竟然直接把 5 过掉了/jk 有 65 也就没管了。后来发现人均切太可惜了。。
然后 rush 了一波 T1 的暴力 Dijkstra 5 分,T3 通信题没了解过就没写。
最后把 zqy & wyz 的 T2 卡过了 65 分。。
5+65+0=70,也不是太好吧。。
练习
状压 + 枚举子集 DP。
二分图最大独立集。
3.22
考试(JOISC2021 Day3)
T1 通信题,写了 5 分状压之后想了想做法,想了很多个贪心都是错的。。晚上问 yjr 了解了一个用栈贪心的 30 分做法,更高分应该就是要利用通信题的特性加密 / 解密信息了。
T2 没看。
T3 想 + 调了很久才搞出来 \(\mathcal{O}(n^2)\) 的 20 分,问 ztl 了解到一个 点分治 + 树状数组的优化方法,写的时候应该是没想清楚细节直接挂了棵线段树,然后一直 WA + TLE,下考都没调出来。。。
5+0+20=25 滚粗了。
练习
受到 JOISC2021 Day1 T3 \(M=1\) 的部分分的启发学了一下线段树区间取 \(\max/\min\)。
以取 \(\min\) 为例,大概就是维护区间最大值 \(f\)、最大值个数 \(cnt\)、次大值 \(se\),每次更新的时候看要取 \(\min\) 的数 \(s\) 与 \(f\) 和 \(se\) 的关系。
- \(s>f\),不要更新,直接 return;
- \(se<s\le f\),不难发现 \(cnt\) 不变,最大值变成 \(s\),维护的信息直接更新,然后 return;
- \(s\le se\),dfs递归子树。
复杂度证明可以使用势能分析,具体可见《Segment Tree Beats!》课件。
到时候可以提交 JOISC 的题目的时候再去写一下吧。
简略看了下 K-D Tree,重新回顾了一下思想,毕竟没写过这东西。。
明天大概就根据嫖到的 zsy 整理的课件内容查漏补缺一下,to-do list 还是要用起来。
希望最后一天 JOISC 加油吧。
3.23
考试(JOISC2021 Day4)
大概是调整好了状态,这次考得还不错(
T1 一开始想到了 \(\mathcal{O}(n^2)\) 做法,去厕所在 nzr 的启发下发现可以用「SCOI2015」国旗计划 类似的套路倍增,然后贪心,判断可以用 set + lower_bound 解决。一道好题。
T2 通信题,暴力压缩数据得了 7 分。
T3 没怎么看。
100+7+0=107。
练习
学习了线段树区间加等差数列,维护一棵差分线段树即可,注意不要添加不存在的区间。
学习了前后缀优化连边,做了「PA2012」Tax。
总结一下前后缀优化连边:
- 建立超级源点 \(S\),超级汇点 \(T\),把无向边转化成有向边,化边为点;
- \(S\) 想向原图中 \(1\) 号点的所有出边连边,\(n\) 号点的所有入边向 \(T\) 连边;
- 所有边向自己的反向边连权值为原图权值的边;
- 将每个点的出边排序,对于排序后的点 \(i\) 和 \(i+1\),\(i\) 向 \(i+1\) 连边权为 \(w_{i+1}-w_i\) 的边,\(i+1\) 向 \(i\) 连边权为 \(0\) 的边。
证明可见 这一篇题解。
洛谷 P5112 FZOUTSY 将每个长度为 \(k\) 的字串哈希出来,问题转化成区间内相同的数的个数,可以使用莫队。
「NOI2020」命运 好题。分析性质后巧妙 DP + 线段树合并。有时间可以写一篇题解。
3.24
考试
大概是最近状态最差的一次。
想题完全静不下心。。。T1 的 DP 想到状态了,就是一直想不出转移,T2 的特殊性质还写挂,T3 暴力没写。。。
然后就只有暴力的 10+10+0=20。。
后面发现 T1 的转移其实应该是想得通的。。T2 倒是的确有些复杂。。
练习
CF1408E Avoid Rainbow Cycles 图论建模 + 最大生成树。
CF1312E Array Shrinking 还算正常的区间 DP。
3.25
考试
状态恢复了一些,但是没有持续到考试结束。。
T1 想到了正解,一开始遇到了瓶颈只会 \(\mathcal{O}(k^2)\),但是和爆搜是一个分。。然后想到可以高维前缀和处理,预处理了一些东西卡卡常就过了。
T2 先写了暴力 \(\mathcal{O}(n^2)\),看数据范围发现是 \(5\times 10^6\) ,以为 \(\mathcal{O(n\log n)}\) 没有多给分就没写(事实上有人直接过了),最后暴力竟然还写挂了???
T3 不会 SAM 就没写。
100+0+0=100。
练习
CF1207F Remainder Problem 根号分治简单题。
CF1299C Water Balance 需要发现一定性质的单调栈题。
CF1407D Discrete Centrifugal Jumps 妙妙的单调栈 + DP。
3.26
考试
前两题都没怎么看,一直在刚 T3。
T3 想到了一个线段树优化 DP 的做法,套了个二分可能常数太大,被卡常 20 分。
T1 构造,T2 DP + 决策单调性。
练习
好像没做别的题了。。。
3.27
考试
T1 建虚树后 DP,设 \(f_i\) 表示子树内的贡献,\(g_i=\sum f_{son_i}\) 辅助转移,套个树状数组即可。
T2 T3 都没怎么看。
3.28
练习
「NOI Online 2021 提高组」 积木小赛 哈希 + 去重。
2018.10.16 subsets (同 「USACO12OPEN」Balanced Cow Subsets G)meet-in-the-middle 折半搜索。前半部分 \(\mathcal{O}(3^{\frac{n}{2}})\) 爆搜并存储状态,后半部分 \(\mathcal{O}(3^{\frac{n}{2}})\) 爆搜后依次匹配,实现时用 map + set 即可。
「CEOI2011」Hotel 贪心 + 二分 + 并查集。
3.29
考试
T1 和 T3 写的暴力,T2 没怎么看。
40+0+35=75。
正解 T1 转成卷积形式后 NTT,T2 是一道最短路题 + 不断优化算法,T3 神仙推式子题。
练习
状压 DP。
设 \(f_{i,j,s}\) 表示前 \(i-1\) 个人已经打好饭,最后一个打饭的是 \(i+j\)(\(j\in [-8,7]\)),\(i\sim i+7\) 的状态为 \(s\) 的最少时间。
数组偏移一下,转移时看 \(s\&1\) 的值分类讨论 + 枚举即可。
结论:DAG 的树形图个数为 \(\prod in_i\)。其中 \(in_i\) 为点 \(i\) 的入度。
考虑不合法的情况一定是有环的,且新边 \((x,y)\) 一定在环中。那么先建反图,考虑设 \(f_i\) 表示从 \(y\) 开始到点 \(i\) 的不合法的方案数,则 \(ans=\prod in_i-f_x\)。
考虑如果出现了一个环 \(a_1,\dots,a_k\),它对答案的贡献就是 \(\frac{\prod in_i}{\prod in_{a_i}}\)。
记忆化搜索更新 \(f_i\) 即可。
3.30
考试
题目太诡异了……所以考得不好也不怪我 \(\texttt{/cy}\)
T1 没想到题目的一个性质:最多选 \(n\) 段圆弧。有了这个性质就可以枚举 \(c_1\) 是怎么选的然后做序列上的 DP。转移时记录当前的最多段数和方案数,通过上一个颜色相同的点转移。
T2、T3 都不会。
10+0+0=10。
练习
入门了一手 WQS 二分……虽然以前会过(
P4983 忘情 WQS 二分 + 斜率优化。
CF1498D Bananas in a Microwave 类似 DP 的思想,需要慢慢思考。
「APIO2016」最大差分 很有意思的一道交互,利用答案的范围值域分块求解。
3.31
考试
状态还不错……该签到的题签到成功了,暴力分也打了不少。
T1 树剖 + 分类讨论,算是猜了一个结论吧。只是刚开始策略不行把所有部分分都打了一遍,太浪费时间了。
T2、T3 都是暴力。
T2 最后 5min 把自己对于随机数据的处理方法改错了……丢掉了 15 分……最后几分钟绝对不要改代码!!1
100+27+46=173。
练习
不难发现每一个度数 \(\le 3\) 的点都可以当做第一个点,显然最小的最优,设为 \(rt\)。
然后设 \(f_i\) 表示以 \(rt\) 为根的树中点 \(i\) 的子树内度数 \(\le 3\) 的最小点编号。
从 \(rt\) 开始 dfs,看哪个方向作为父亲 / 右儿子更优,这个可以利用 \(f\) 数组方便地判断。
来源:gzy《贪心交流讨论》2020 年 9 月 22 日
4.1
考试
T1 暴力不会,也没怎么想。
T2、T3 都是暴力。
一开始 T2 想了个假的贪心,后来发现锅太大了;T3 以为分挺高结果考后被 yjr 叉掉了,只有最低档分……
练习
决策单调性好题。
把被包含的区间去掉之后容易分类讨论证明按照左端点依次分配给身高从低到高的人不会更劣。
对于每组学生分配的课桌,有决策单调性。因此可以使用分治对每组学生的最优课桌进行计算。
分治时二分 + 前缀和可以快速计算贡献。
来源:Itst《杂题选讲》2021 年 3 月 17 日
参考题解:
挺妙的一道数位 DP。
考虑如果我们知道了 B,该怎么算是否满足。
数位 DP,\(f_{i,0/1,0/1,0/1,0/1}\) 代表是必须在 \(x\),\(y\) 的四个边界上。
如果要计数的话,把这四个东西的 \(0/1\) 值全压进去就好了。
注意到一个结论:较小的方案集合是较大的方案集合的子集(大小指的是元素数量)。这样只要当前位两个数的 and 为 \(0\),就只要取最大的方案来加即可。
来源:gzy《dp 交流讨论》2020 年 9 月 26 日
参考题解:
4.2
考试
没什么好说的,题目太毒瘤了。
20+0+0=20。
练习
设 \(f_{i,j}\) 表示第 \(i\) 个位置的数字为 \(j\) 的方案数,\(s_i=\sum f_{i,j}\)。
若 \(a_i \not = -1\) 且 \(a_i \not = j\),则 \(f_{i,j}=0\)。
设 \(l_{i,j}\) 表示从 \(i\) 开始向后最多能有多少个连续的 \(j\)。
那么当 \(l_{i,j} < len\) 时 \(f_{i,j} = s_{i−1}\)。
否则还要减去不合法的方案,为 \(s_{i−l} − f_{i−l,j}\) 。
来源:xgzc《动态规划专题乱讲》
特别好的一道题。
挖坑待填。
我们称一次“询问 \(x\) 是否在点集 \(S\) 的最小连通块上”的操作为 \(query(S, x)\)。
首先,如果 \(|S|=2\),那么一次询问就等价于询问 \(x\) 是否在两点间的路径上。
任意枚举 \(3\) 个点询问即可得到复杂度 \(\mathcal{O}(n^3)\) 的做法。
如何优化成 \(\mathcal{O}(n^2)\)?
考虑直接进行一次 \(query(\{1,u\},v)\) 即可得到 \(u\)、\(v\) 之间是否存在“祖先-后代关系”,然后就可以得到整棵树的形态。
具体地说,设 \(i\) 号点的祖先集合为 \(Anc_i\) (特殊地,我们认为 \(i\) 号点本身也是 \(i\) 号点的祖先)。那么对于一个点 \(x\) 来说,它的父亲 \(f\) 就是满足 \(Anc_f \subset Anc_x\) 的 \(|Anc_f|\) 最大的点。确定每个点的父亲,我们确定了这棵树的形态。
考虑 \(|S|>2\) 的情况。对于一个点集 \(S\) 与一个点 \(u\) 我们进行一次 \(query(S \cup\{1\},u)\),若结果为 true 则说明 \(S\) 中存在 \(u\) 的后代,否则不存在。证明的话可以发现如果返回值为 true 则说明 \(1\) 与 \(u\) 子树中的一个点穿过了 \(u\),继而得到结论。
然后就可以通过二分找到 \(S\) 中任意一个 \(u\) 的后代,扩展一下就可以得到 \(S\) 中 \(u\) 的所有后代。
接下来是本题最关键的一步:
若我们将有根树的每一条边视为从儿子指向父亲的有向边,那么我们可以将有根树视作一张有向无环图,定义出一棵有根树的拓扑序。
得到这棵树的拓扑序后,我们就可以得到这棵树的形态。
具体地,
- 设 \(a_{1\dots n}\) 为该树拓扑序上第 \(i\) 个点的编号,集合 \(V\) 的初始值为该树的点集。
- 令 \(i\) 从 \(1\) 扫到 \(n\),每一步在 \(V\) 中找到 \(a_i\) 所有的后代,然后将这些后代从 \(V\) 中去掉。
由于一个点非儿子的后代已经在这些后代对应的父亲处从 \(V\) 中被去掉,所以一个点找到的那些后代就是它在原树中所有的儿子。
接下来可以考虑“剥叶子”,每次找到一个叶子并把它从树中删掉。直接做复杂度是 \(\mathcal{O}(n^2)\) 的。
接下来考虑各种优化:
- 随机化。
- 每次不断从该树的点集中随机找到当前点的一个后代然后跳过去,直到找到一个叶子为止。
- 这样的复杂度是期望 \(\mathcal{O}(n\log^2 n)\) 的。
- 考虑优化剥叶子的次数。
- 我们发现树有一个性质,那就是如果这棵树中没有二度点,则这棵树的叶子个数至少为总点数的一半。
- 这样就可以每次找到一条原树中的叶子以及叶子之上那条由二度点构成的链并把它删去。找出这些点之后按照它们对应的那个叶子后代分组,每组之内还要进行一次“祖先-后代”的排序。
- 排序可以通过 \(query(\{1,u\},v)\) 来比较。
- 复杂度 \(\mathcal{O}(n\log^2 n)\)。
接下来考虑分治。论文里有一种通过染色分治的做法,这里不展开赘述。
介绍一种类似分治的思想的一种 \(\mathcal{O}(n\log n)\) 做法:
- 处理 \(x\) 的子树时,不断找到 \(x\) 的一个后代 \(y\) 并对 \(y\) 分治下去,最后把 \(x\) 子树内 \(y\) 的部分剥掉。
这个算法的核心思想是去除冗余信息,从而达到降低复杂度的目的。
还有一种直接在拓扑序上考虑的做法:
- 考虑拓扑序的性质,即每个点的祖先一定在这个点之后出现,如果我们可以在每次插入点时维护这个性质,就可以解决这个问题了。
- 只需要二分出当前拓扑序的一个位置满足这个位置之后没有 \(x\) 的后代且这个位置尽量靠前,将 \(x\) 插入到这个位置之后即可。
这个做法特别具有启发性,代码实现可以见 我的代码。
参考资料:2020 年信息学奥林匹克中国国家集训队论文《潘骏跃,<最小连通块>命题报告 》
4.3
考试
T1 费用流,但建模想复杂了,没有 get 到点子上。
T2、T3 都是暴力,但是没注意编译选项 T2 用 auto 爆零了。
0+0+30=30。
实际上 T1 发现一个性质后直接跑 MCMF 有 60 分,考虑清楚一个细节后就可以 AC。
T2 bitset + 树剖 + 线段树,bitset 维护种类数的方法很妙。
练习
挺神仙的一道构造。
对于每个点 \(i\),记录一个 \(S_i\) 表示包含点 \(i\) 的集合编号的集合。这个可以使用 bitset 存储。
然后建一个完全图,点 \(i\) 和点 \(j\) 之间边的长度是 \(|S_i\cap S_j|\),bitset 之间的运算可以求出这个东西。
对这个完全图跑一遍最大生成树,如果满足条件那么答案就是这棵树,否则无解。
证明的话建议感性理解,边的长度越大就说明它们形成一个连通块的概率就越大,如果需要具体证明可以见官方题解。
实现还是需要一点技巧的。
4.4
练习
CDQ 分治。按照 \(x\) 排序,\(y\) 归并。
考虑左边对右边的贡献,用单调栈维护;去除不合法情况可以单调栈 + 二分来做。
参考题解 写的很详细。
4.5
考试
暴力 5+0+20=35。
T2 爆零是因为数据有锅。。。
T3 bitset + 滚动数组的方法很妙,虽然只有 30 分。
T1 正解是根据强连通图的耳分解 (ear decomposition) 得到的一个 DP 做法,就是记 \(g_s\) 表示已经加入集合为 \(s\) 的最小花费,\(f_{s,i,j}\) 表示当前点集中以及当前链上的点的集合为 \(s\),链头为 \(i\) ,链尾为 \(j\) 的最小代价互相转移即可。
练习
简单计数。
实际上,序列中每一个亮的位置把序列划分成了许多由 \(0\) 组成的区间。考虑最后的操作序列,长度为 \(l\) 的区间一定会在序列中占据 \(l\)个位置。按顺序考虑,第 \(i\) 个区间在操作序列中的方案为
然后考虑区间内部的方案。对于非开头和结尾的区间,每次都可以选择在最左边或最右边把一个 \(0\) 变成 \(1\),所以方案为 \(2^{l_i −1}\)。乘起来就行了。
来源:CJlzf《计数专题选讲》,2020 年 8 月 20 日
4.6
考试
题目部分分比较多,但是只写了前 2 题,T3 没怎么看,这大概是最大的决策失误。。。
最后 50+30+19=99,T3 大概是出了啥问题捞了点分,但总体还是不太理想。
T1 考场上写的是暴力 \(\mathcal{O}(n^2)\) DP,正解可以贪心 + 启发式合并,也可以找到 DP 数组的性质后线段树合并 + 二分。(总结:不要 DP 学傻了!!1)
T2 猜到了结论:答案 \(\le 2\),然后可以 bitset + 高斯消元求出自由元个数计数。
练习
笛卡尔树 + DP。
对序列建立小根笛卡尔树。
设 \(f_{i,j}\) 表示 \(i\) 的子树中放 \(j\) 个相同数字的方案数,转移可以从子树中转移来,也可以在自己所代表的矩形中填。
当前矩阵长度为 \(sz_i\),高度为 \(h_i-h_{fa_i}\)。前者可以树形背包转移,后者需要一个结论:
在 \(n\times m\) 的矩阵中放 \(k\) 个互不攻击的车的方案数为 \(\binom{n}{k}\binom{m}{k}k!\)。
枚举已经在儿子中放了几个车,直接计算即可。
好题。
直接计算非常困难,我们考虑转化一下题意。
不妨将一行座位看成是一个环,在环上 \(n\) 和 \(1\) 之间插入一个点 \(n+1\),一旦有人选择这个点就说明当前方案不合法。
然后计算方案数。
我们计算一个位置被选中的概率,因为环上各点等价,所以被选中的概率相同,均为 \(\frac{m}{n+1}\)。
那么合法情况的概率为 \(1-\frac{m}{n+1}=\frac{n+1-m}{n+1}\),乘上总方案数 \((2(n+1))^m\) 就是答案。
来源:CJlzf《计数专题选讲》,2020 年 8 月 20 日
计数好题。
经典套路,考虑每条边的贡献,设点 \(i\) 的子树大小为 \(sz_i\),那么这条边的贡献就是 \(sz_i(n-sz_i)\)。
枚举 \(sz_i\),那么子树就会有 \(sz_i!\) 种形态,选择节点方案 \(\binom{n-i}{sz-1}\)。
对于子树外,生成比 \(i\) 小的点有 \(i!\) 种方案;\(i\) 之后除了钦定的点之外,其余的都不能放在 \(i\) 的子树中,故每个点的方案分别为 \((i + 1 − 2), (i + 2 − 2), ..., (n − sz_i + 1 − 2)\)。这里非常重要,需要慢慢体会。
整理一下,答案就是
预处理阶乘和组合数后直接计算即可。
来源:CJlzf《计数专题选讲》,2020 年 8 月 20 日
4.7
练习
考虑 Lucas 定理:
将 \(n\) 和 \(m\) 考虑为 \(k\) 进制拆分的形式,那么我们可以得到:
观察右边,只要有一项为 \(0\),整个答案就都是 \(0\) 了。
而 \(n_p,m_p < k\),所以 \(\binom{n_p}{m_p}\)不可能是 k 的倍数。因此,\(\binom{n_p}{m_p}\) 等于 \(0\) 当且仅当 \(n_p < m_p\) 。
设 \(dp_{i,0/1,0/1,0/1,0/1}\) 表示到第 \(i\) 位,\(n\) 和 \(m\) 是否贴着上界,是否出现 \(n_p<m_p\),前 \(i\) 位 \(n\) 和 \(m\) 是否相同。
数位 DP 即可。
来源:CJlzf《计数专题选讲》,2020 年 8 月 20 日
考虑问题的组合意义,即在 \(nk\) 个物品中选择 \(x\) 个物品(\(x\mod k=r\))的方案数。
这个可以 DP 做。设 \(f_{i,j}\) 表示从前 \(i\) 个物品中选 \(j\) 个的方案数,转移时考虑当前物品选不选:
注意到运算都是在 \(\mod k\) 意义下进行的,因此要处理好负数的情况。
矩阵快速幂加速递推即可。
来源:CJlzf《计数专题选讲》,2020 年 8 月 20 日
神仙状压 DP + 卡空间题。
设 \(f_s\) 表示前 \(|s|\) 个位置中放了 \(s\) 集合中的数的最小传递时间。
转移时讨论一下对于在 / 不在集合中的数的贡献,具体可以看参考题解。
但是会被卡空间。
考虑一边 DP 一边求 cost 数组,利用 queue 实现。
我们可以转移完这一层的 DP 后去更新一个 最小的 \(s'\) 的 cost,然后加进队列。
这样就可以过了。
参考题解:
更多卡空间方法:
首先考虑不合法的情况。设 \(sum_i\) 为位置在 \(i\) 之后的人数,如果 \(∃sum_i > n − i + 1\) 就不合法。
接下来考虑 DP。
设 \(f_{i,j}\) 表示后 \(i\) 个位置有 \(j\) 个人的方案数(\(0\le j\le n-i+1-sum_i\)),转移显然:
表示后 \(i+1\) 个位置有 \(k\) 个人的方案数之和。
最终答案为 \(f_{1,n−m}\)。
来源:CJlzf《计数专题选讲》,2020 年 8 月 20 日
4.8
考试
最后一次考试。。
先开 T3,写了个线段树,发现加一个 fl 标记就会 WA,不加就会 TLE。。2h 调试后自闭。。正解是分块,维护每个块内的递增序列,二分出需要减多少次,然后算出答案。
自闭后看 T1,一开始正向想发现做不出,容斥一下减去不合法的方案,就可以 set 查找前驱后继 + 树状数组维护前缀个数 \(\&\) 前缀和解决问题。
T2 广义 SAM 上 DP,不会。。写的爆搜 10 分。
最后 100+10+30=140。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号