2026寒假做题记录
[长沙省集] 火力大喵
tag:网格图分治、前缀和
题意:求满足边上最大值和最小值的差最大的矩形个数。
我们只关心最大值、最小值和其他。容斥一下,现在只需要考虑边上全 \(0\) 矩阵数量。
考虑分治。我们考虑沿较宽的一边的中间分开来分治,然后考虑跨越分治中心的合法矩形个数。对于分治中心两点 \(u,v\),只需要求出左右的形如 C 和 Ɔ 的结构个数。
对于分治中心上一点 \(u\),我们求出它到左边第一个 \(1\) 的位置 \(h_u\),和边上的每一个点下边第一个 \(1\) 的位置 \(d_{u,j}\),对其开一个桶,做前缀和,我们就可以得到边上能到达第 \(v\) 行的点的个数。
那么我们就能知道 \(h_u\ge h_v\) 时 \(u,v\) 间合法竖边个数;相应的,我们同样找出每一个点上边第一个 \(1\) 的位置 \(u_{u,j}\),同理进行统计,那么我们也能知道 \(h_u<h_v\) 时 \(u,v\) 间合法竖边个数。
[AGC066A] Adjacent Difference
tag:构造、Ad-hoc
题意:给定一个矩阵,你可以对每个数 \(\pm1\),构造一个方案使相邻两数之差不少于 \(d\),操作次数不多于 \(\frac{n^2}{2}d\)。
我们削弱条件,考察 \(d=1\) 时的情形。发现可以对棋盘黑白染色,黑色部分改为奇数,白色部分改为偶数,或者黑色部分改为偶数,白色部分改为奇数。因为这两种方案更改次数之和为 \(n^2\),由平均值原理,必有其中一种方案更改次数不多于 \(\frac{n^2}{2}\)。
容易发现,我们在 \(\bmod 2d\) 意义下,将 \(d\) 看为奇数,\(0\) 看为偶数即可解决 \(d\in N^{+}\) 的情形。
[CF1172D] Nauuo and Portals
tag:构造、Ad-hoc
题意:构造若干个传送门,使得从第 \(i\) 行左侧出发的人到达第 \(r_i\) 行,第 \(i\) 列上侧出发的人到达第 \(c_i\) 列。\(r_i\),\(c_i\) 均为排列。
我们考虑将 \(n\times n\) 的问题处理后转化为一个 \((n-1)\times (n-1)\) 的子问题。
考虑构造传送门 \((p,1), (1,n)\) 和 \((1,q), (n,1)\)。那么第 \(p\) 行、第 \(q\) 列出发的人可以到达该到的位置。原来在第一行的人将会到第 \(n\) 行,第 \(n\) 行的人将会到第 \(p\) 行,第一列的人将会到第 \(n\) 列,第 \(n\) 列的人将会到第 \(q\) 列。
这样,我们让最终到第一行、第一列的人满足了条件,并且剩余的限制依旧是一个排列。继续向下处理即可。
[NOI2023] 贸易
tag:Ad-hoc
题意:给你一个满二叉树,和 \(m\) 个前向边,边有边权,问你两两点之间最短路之和。
对于两个点 \(u,v\),因为没有横叉边,于是 \(u\) 到 \(v\) 的最短路可以看成两部分 \(u \rightarrow lca(u,v) \rightarrow v\)。
对于前半部分,如果走了第二类边,那么肯定出现了环,必定不优。因此前半部分必走树边。
对于后半部分,定义 \(f_{u,i}\) 表示从点 \(u\) 的满足 \(dep_v=i\) 的祖先 \(v\) 到 \(u\) 的最短路。
首先考虑仅经过一条第二类边的情形。对于一条 \(u\rightarrow v\) 的第二类边,它可以更新所有祖孙关系形如 \(u\rightarrow x\rightarrow y\rightarrow v\) 的 \(f_{y,dep_x}\)。
再拓展到所有情形,发现这一过程与 Floyd 类似。从而枚举中转点同时注意使用恰当的枚举顺序即可。
[CCPC 2023 北京市赛] 线段树
tag:线段树、观察性质
题意:你有一个全为奇数的数列,你需要维护区间加偶数、区间求积,对 \(2^20\) 取模。
因为数列在任意时刻均为奇数,不妨设 \(b_i=2a_i+1\)。
那么区间求积就变成了求少于 \(20\) 个数的积之和。
维护 \(f_i\) 表示区间任意 \(i\) 个数的积之和即可。
[ABC107D] Median of Medians
tag:二分
题意:给你一个数列,定义中位数是第 \(\lfloor\frac{n}{2}\rfloor+1\) 小的数。设 \(m_{l,r}\) 为 \(l\) 到 \(r\) 的中位数。让你求 \(m\) 的中位数。
发现 \(m_{i,j}\) 的取值仅仅与一维数列有关之类的性质,可以尝试二分。也就是要求 \(m_{l,r}\ge x\) 的 \((l,r)\) 对数。
发掘中位数 \(\ge x\) 的性质。这等价于设 \(b_i=\left\{\begin{aligned}b_i=1(a_i\ge x) \\ b_i=-1(a_i<x)\end{aligned}\right.\),\(\sum\limits_{i=l}^{r}b_i\ge 0\)。
枚举 \(l\),每次在数状数组上查不小于 \(0\) 的 \(r\) 的个数,\(l\) 向右移即全局 \(\pm 1\)。
[Ynoi] 我是仙人掌
tag:bitset
题意:给你一个无向图,每次询问给出若干个点对 \((x_i,y_i)\),求满足任意一个 \(\operatorname{dis}(x_i,u)\le y_i\) 的点 \(u\) 的个数。
设 \(f_{u,i}\) 表示满足 \(\operatorname{dis}(u,v)\le i\) 的点 \(v\) 组成的集合。然后这东西随便求一求就可以了。然后查询就是或起来。
主要是有时候会忘记有 bitset 这个东西,之后需要注意一下。
[ARC059C] キャンディーとN人の子供
tag:DP
题意:晦涩难懂。
叽里咕噜说什么呢。其实就是让你求 \(\sum\limits_{x_1=a_1}^{b_1}\sum\limits_{x_2=a_2}^{b_2}\dots\sum\limits_{x_n=a_n}^{b_n}\prod\limits_{i=1}^{n}x_i^{c_i}\)。因式分解一下,就是让你求 \(\prod\limits_{i=1}^{n}\sum\limits_{x=a_i}^{b_i}x^{c_i}\)。
设 \(dp_{i,j}\) 表示给前 \(i\) 个小朋友发了 \(j\) 颗糖的答案。则可得转移 \(dp_{i,j}=\sum\limits_{k=0}^{j}(f_{i-1,j-k}\sum\limits_{x=a_i}^{b_i}x^k)\)。其中 \(\sum\limits_{x=l}^{r}x^{c_i}\) 预处理即可。
[ARC052C] 高橋くんと不思議な道
tag:图论
[AGC037C] Numbers on a Circle 5.5
tag:时光倒流
题意:有 \(n\) 个正整数首尾相接为 \(a\),你每次可以将 \(a_i\leftarrow a_{i-1}+a_{i}+a_{i+1}\),问至少多少次可以变为 \(b\)。
时光倒流一下,就是每次 \(b_{i}\leftarrow b_{i}-b_{i-1}-b_{i+1}\)。然后发现能操作当且仅当 \(b_i\le b_{i-1}+b_{i+1}+1\)。
可以想到每次操作最大的那项是不劣的。用一个堆维护即可。每次值减半,故时间复杂度 \(O(n\log n\log V)\)。
[AGC065B] Erase and Insert 5.5
tag:计数、时光倒流
题意:给你一个排列 \(1, 2, \dots, n\) 和一个目标排列,你进行 \(n\) 次操作,第 \(i\) 次操作将 \(i\) 插入到排列的任意位置。求操作后排列成为目标排列的操作个数。
时光倒流一下,就是从 \(n\) 对排列操作使排列递减。容易发现操作完 \(i\sim n\) 后 \(i\sim n\) 在数列中的位置是递减的。
设 \(dp_{i,j}\) 表示考虑到第 \(i\) 个数,\(i\) 左边有 \(j\) 个数的方案数。很好转移。时间复杂度 \(O(n^2)\)。
[ARC131E] Christmas Wreath 5.7
tag:构造
题意:给你一个 \(n\) 个点的完全图,你需要对边三染色,使得:三种颜色数量相同;不存在两两边异色三角形。
一辈子不会构造。先猜测 \(n\ge 5, n\bmod 3 \not= 2\) 的情况必有解。
考虑怎么保证不存在异色三角形。对于每个 \(i\) 将 \((j,i)(1\le j < i)\) 染为相同颜色。这样三个点中必有一个角是同色的。
那么现在就需要考虑使颜色数相同。也就是把 \(1\sim n-1\) 分成三组,每组数之和相等。
考虑归纳构造。发现 \((n-6)+(n-1)=(n-5)+(n-2)=(n-4)+(n-3)\),那么就将这些数分为三组,就变为 \(n-6\) 的子问题了。
[AGC036C] GP 2 5.7
tag:计数
题意:给你一初始全 \(0\) 数列,你进行 \(m\) 次操作,每次操作选定 \(i, j\),\(a_i\leftarrow a_i+1, a_j\leftarrow a_j+2\),求最后的不同状态个数。
发现这种求不同状态数的问题,可以考虑判定状态是否合法,发掘操作的充要条件,或是考虑容斥。
容易发现操作有如下条件:
- \(\sum a_i=3m\);
- \(\max a_i\le 2m\);
- \(\sum a_i\bmod 2\le m\)。
如果去掉条件 \(2\),我们可以枚举奇数个数。奇数个数为 \(k\) 时如果 \(3m−k\) 是偶数,设其为 \(2p\),那么考虑将奇数全部减 \(1\),剩下的 \(n\) 个非负偶数的和就是 \(2p\),又都是偶数显然等价于 \(n\) 个非负整数的和为 \(p\),所以合法的方案有 \(\binom{n}{i}\times\binom{n+p-1}{n-1}\) 个,否则为 \(0\)。
现在考虑如何去掉多余的,即有一个 \(a_i\) 超过 \(2m\)。发现至多仅有一个,钦定其为 \(a_1\)。那么将 \(a_1\) 减去 \(2m+1\),又变成了 \(n\) 个非负整数和为 \(m−1\),这时条件三就不用考虑了,所以共有 \(n\times\binom{n+m-2}{n-1}\) 种情况。
两种情况相减即可。
[ARC154D] A + B > C ? 5.2
tag:交互、排序
题意:有一个排列,你可以询问 \(O(n\log n)\) 次 \(P_i+P_j\) 与 \(P_k\) 的大小关系,让你求出排列的值。
观察到对任意 \(n>1\),\(1+1>n\) 不成立。因此你可以在 \(n-1\) 次询问中找到 \(1\) 的位置。由整数的离散性,\(1+a_i>a_j \Leftrightarrow a_i\ge a_j\),也就是说,你可以直接按照这个关键字对 \(P\) 排序,进而得到这个排列。询问次数是 \(O(n\log n)\) 的。
P5071 [Ynoi Easy Round 2015] 此时此刻的光辉 6.4
tag:莫队、根号分治、想办法
题意:给你一个数列,\(q\) 次询问,每次询问区间因数个数。
假设 \(n,q\) 同阶。发现 \(10^9\) 以内的数只有不超过 \(10\) 个质因子,因此一段区间内的质因子个数是不超过 \(10n\) 个的,于是我们可以质因数分解后,对其离散化用莫队维护桶。
但是这样做的时间复杂度是 \(O(kn\sqrt{n})\) 的,其中 \(k=\max{\omega(n)}\),无法通过本题。
考虑根号分治,先把不超过 \(B\) 的质因子找出来,然后对其出现次数做前缀和。于是对于每个数最多就只剩下 \(\log_Bn-1\) 个质因子了,对这些质因子离散化后用莫队维护桶即可。
时间复杂度 \(O(Bn+n\sqrt{n}\log_Bn)\),\(B\) 取 \(1000\) 可以通过此题。
有很多神秘做法。
P13306 [GCJ 2013 Finals] Let Me Tell You a Story 6.2
tag:计数、dp、优化
题意:给你一个数列,每次你可以删除一个元素,当数列变为非递增序列时结束。求所有可能的删除顺序个数。
我们考虑枚举出最后剩下的非增子序列长度 \(k\),设 \(f_k\) 表示长度为 \(k\) 的非增子序列个数,那么下意识的想法是 \(\sum f_k(n-k)!\)。但是因为你不知道他是否删到一半就结束了,所以这样会算重,那你考虑容斥,减掉重复的贡献,就是在选出序列长度为 \(k+1\) 时的所有情况再随便删掉 \(1\) 个数的所有贡献,也就是 \(f_{k+1}(n-k-1)!(k+1)\),那么答案就是 \(\sum f_k(n-k)!-f_{k+1}(n-k-1)!(k+1)\)。
问题变成怎么算 \(f\)。考虑 dp,设 \(dp_{i,j}\) 为以 \(i\) 结尾,长度为 \(j\) 的合法子序列个数,那么有 \(dp_{i,j}=\sum dp_{k,j-1}[a_k\ge a_i]\),发现这个部分是一个二维数点,树状数组维护即可。\(f_i\) 就是 \(\sum dp_{j,i}\)。时间复杂度 \(O(n^2\log n)\)。
P14636 [NOIP2025] 清仓甩卖 6.6
tag:计数、双指针
题意:现在有 \(n\) 个物品有原价 \(a_i\),现价 \(w_t\in \{1,2\}\),你有 \(m\) 元钱。有策略:按性价比从大到小排序贪心买物品。求对于 \(2^n\) 种定价,有多少种策略可以使买到的物品原价之和最大。
计数的时候要考虑找合法策略的等价条件。
你考虑什么时候这个策略会炸。策略错误当且仅当你买了一个 \(w_t=1\) 的物品,然后到后面买到一个 \(w_t=2\) 的时候只剩 \(1\) 块钱,从而买了性价比更低的 \(w_t=1\) 的物品,形如 \(\dots x\dots (y)z\)。
我们考虑枚举 \(x, y\),\(w_x=1, w_y=2\),那么首先需要有 \(a_x<a_y<2a_x\)。
先对 \(a_i\) 排序,我们考虑其他物品(记为 \(a_t\))被选择出来的条件。
- 若 \(x<t<y\),
- 若 \(w_t=1\) 会不满足枚举条件。此时 \(\frac{a_y}{2}<a_t<a_x\),不能取,不能买。
- 若 \(w_t=2\),此时 \(a_y<a_t<2a_x\),可以取,可以买。
- 若 \(t<x\),
- 若 \(w_t=1\),此时 \(a_t>a_x\),可以取,可以买。
- 若 \(w_t=2\),此时 \(a_t>a_y\),可以取,可以买。
- 若 \(t>y\),
- 若 \(w_t=1\),这可能是 \(z\),先不去管它。
- 若 \(w_t=2\),此时 \(a_t<a_y\),可以取,不能买。
整理一下:
- \(a_t>a_y\),有 \(n-y\) 个,\(w_t\) 是多少都可以随便买,消耗 \(1\) 或 \(2\) 块。
- \(a_x<a_t<a_y\),有 \(y-x-1\) 个,\(w_t=1\) 时可以买,\(w_t=2\) 时你不能买,消耗 \(0\) 或 \(1\) 块。
- \(\frac{a_y}{2}<a_t<a_x\),你需要让 \(w_t=2\),然后不能买。
选完这些之后,你最后需要只剩下 \(2\) 块钱来买 \(x,z\)。也就是说,这些东西花费了 \(m-2\) 块钱。
先对所有 \(a_t>a_y\) 的 \(t\) 付 \(1\) 块钱,也就是说,你现在要在 \(n-x-1\) 个物品中选 \(m-2-(n-y)\) 个物品付 \(1\) 块钱。即 \(\binom{n-x-1}{m-2-(n-y)}\)。那 \(a_t>a_x\) 的部分就搞完了。
对于 \(a_t<a_x\) 的部分,我们需要让 \(a_t+a_x\ge a_y\) 的 \(t\) 都不成为 \(z\),剩余的随便选即可。那就用双指针找到最大的 \(t\) 使 \(a_t+a_x<a_y\),方案数为 \(2^t\)。
P2757 [国家集训队] 等差子序列 6.0
tag:哈希
题意:给你一个排列,问是否存在等差子序列。
枚举 \(a_i\),用一个桶来标记数有没有出现过。那么如果存在 \(d\) 满足 \(t_{a_i-d}\not=t_{a_i+d}\),那么说明 \(a_i-d\) 和 \(a_i+d\) 是在 \(a_i\) 的两侧出现的,于是就存在等差子序列了。
那么你只需要判断以 \(a_i\) 为中心的桶是否回文即可。线段树维护哈希值即可。
板刷 agc 绿
比较唐的题不写题解。
[AGC001C] Shorten Diameter
tag:贪心、树的直径
题意:给你一棵树,最小化删掉叶子的个数,使直径 \(\le k\)。
我们可以每次找出一条直径,然后分别算一下这条直径的两个端点能到达的距离 \(>k\) 的点的个数,将个数较大的那个端点删去。然后继续找直径做这样的操作即可,直到直径长度 \(\le k\)。这个贪心是好证的。
[AGC003C] BBuBBBlesort!
tag:贪心
题意:给你一个序列,你可以交换相邻、隔一个格的两个元素,最小化交换相邻次数,使序列有序。
我们发现可以贪无数次操作二,那么肯定能用操作二就用。但是发现奇数位的元素一直在奇数位,偶数位的元素一直在偶数位。这时候发现操作一可以消掉奇偶不匹配的情况。那么答案就是 \(\frac{\sum [|i-a_i|为奇]}{2}\)。
[AGC004B] Colorful Slimes
tag:dp
题意:你可以插入元素 \(i\),全局模意义 \(+1\),每个不同操作均有一定代价,求得到所有元素的最小代价。
设 \(dp_{i,j}\) 表示使用 \(j\) 次魔法得到第 \(i\) 只史莱姆的最小代价。\(dp_{i,j}=\min(dp_{i,j-1},a_{i-j})\)。答案即 \(\min\{kx+\sum dp_{i,k}\}\)。
[AGC008B] Contiguous Repainting
tag:前缀和
题意:你有一个序列,初始全不选,每次可以选/不选相邻 \(k\) 个数,最大化选的数的总和。
这么弱智的题想这么久。考虑找到最后一次操作,这部分要么全不选,要么全选,剩下的部分发现可以通过操作选出所有的正数。于是就做完了。
[AGC015C] Nuske vs Phantom Thnook
tag:树、前缀和
题意:给你一个01矩阵,1组成的所有连通块都是一颗树。每次询问查询子矩阵1的连通块个数。
发现树有一个性质 \(n-m=1\)。那么这是个森林,树的个数,也即连通块个数,就是所有点的个数减去连边个数。前缀和一下就做完了。
[AGC021D] Reversed LCS
tag:猜、区间dp
题意:给你一个字符串 \(S\),你可以修改其中 \(k\) 个字符。最大化 \(\operatorname{lcs}(S,\operatorname{rev}(S))\)。
很好猜出结论:\(\operatorname{lcs}(S,\operatorname{rev}(S))=\operatorname{lps}(S)\)。
因为 \(\operatorname{lps}(S)\) 所对应的回文串对称,所以在正串、反串都出现过,得 \(\operatorname{lps}(S)\le \operatorname{lcs}(S,\operatorname{rev}(S))\)。\(\operatorname{lps}\ge\operatorname{lcs}\) 的部分略。
设 \(dp_{l,r,k}\) 表示区间 \([l,r]\) 修改了 \(k\) 个字符的 \(\operatorname{lps}\)。很好转移。
[AGC023B] Find Symmetries
tag:无
题意:给你一个 \(n\times n\) 的矩阵,求 \(a,b\) 的个数,满足:将最下面 \(a\) 行移到最上面,将最右边 \(b\) 列移到最左边,有 \(a_{i,j}=a_{j,i}\)。
有两种想法。
一种是发现 \((a,b) \Leftrightarrow (a+x,b+x)\),于是只需要枚举 \(a\) 即可。那就 \(O(n^3)\) 判吧,没想到什么优化。
另一种是发现这是一个 \(2n\times 2n\) 矩阵的滑动矩阵。然后矩阵对称满足 \(A^T=A\),所以你可以尝试二维哈希,判哈希值。\(O(n^2)\)。
[AGC024B] Backfront
tag:找性质
题意:给你一个排列,每次可以选择一项移到开头或结尾,求将排列排好序的最少操作次数。
可以发现性质:对于一段每次递增一个上升的子序列,在排好其他数字的同时,这个子序列也会自动排好。而且你剩下的子序列也肯定要满足这种限制,不然就不合法了。
设 \(l\) 为连续递增 \(1\) 的最长上升子序列的长度,那么答案即为 \(n-l\)。

浙公网安备 33010602011771号