1 月记录

详细揭秘:低秩矩阵分解与矩阵树定理极简证明 && 如何求完全多部图生成树个数?

P14836 [THUPC 2026 初赛] 能量分配

P14833 [THUPC 2026 初赛] 生命线

P14238 [CCPC 2024 Shandong I] 三角形

P12251 [科大国创杯初中组 2025] 抽卡

P10436 [JOIST 2024] 卡牌收集

P9252 [PA 2022] Wielki Zderzacz Termionów

P7907 [Ynoi2005] rmscne

给定长为 \(n\) 的序列,\(q\) 次询问区间 \([l,r]\) 的最短子区间 \([l',r']\),满足所有在 \([l,r]\) 中出现的数也在 \([l',r']\) 中出现. 你只需要输出 \([l',r']\) 的长度 \(r'-l'+1\)

\(n,q\le 2\times 10^6\)


法一

将左端点限制散开,拆成左端点出现在 \([l,l']\),其中 \(l'\) 为最大左端点使得 \([l',r]\) 合法。

发现这是 \(p\in [l,l'],[p,r]\) 的值域就是 \([l,r]\) 的值域

考虑扫描线,扫 \(r\),对 \(l\) 维护最短 \(r'\) 使得 \([l,r']\) 对于 \([l,r]\) 合法,修改是后缀覆盖。

那么发现 \([l,l']\) 中当前维护的最短区间就是答案。

法二

对每个子区间维护二元组 \((cnt,len)\) 分别表示颜色数,长度,则问题相当于对子区间第一维取最大值,第二维取最小值。

考虑将二元组拼成一个 long long,扫描线时都是区间修改,查区间子区间权值最大值,维护历史最值即可。

法三

不妨考虑一个暴力,初始固定 \(l'=l\),容易求出最小合法 \(r'\),令其为 \(s\)

\(l'\to l'+1\),发现就是把答案与 \(nxt_{l'}\)\(\max\)

那么对于 \(l'\),其 \(r'\) 即为 \(\max(s,\max_{i=l}^{l'-1}nxt_i)\),求 \(\max(s,\max_{i=l}^{l'-1}nxt_i)-(l'-1)\) 的最小值,容易求出 \(l'\) 的前缀范围。

讨论两者大小关系,找到 \(nxt_i\) 的前缀最大值,则一段区间只有末尾是有用的,单调栈维护一下即可。

P7447 [Ynoi2007] rgxsxrs

给定一个长为 \(n\) 的序列 \(a\),需要实现 \(m\) 次操作:

1 l r x:表示将区间 \([l,r]\) 中所有 \(>x\) 的元素减去 \(x\)

2 l r:表示询问区间 \([l,r]\) 的和,最小值,最大值。

\(n,m\leq 5\times 10^5\)\(1\leq a_i,x\leq 10^9\)


考虑对值域倍增分块,每个块维护一棵线段树。

  • 若区间没有可修改维护,返回。

  • 若区间所有存在数都会修改,且修改后不会掉块,则打标记返回。

  • 否则往下递归。

如果当前是 \(>x\) 的块,那么往下递归多出来的复杂度是均摊的,为 \(\mathcal O(n\log V\log n)\)

如果当前是 \(x\) 对应的块,那么访问到的所有叶子都会掉块,所以复杂度均摊正确。

但是这题卡空间,不妨对线段树底层按照 \(\log V\) 分块,只会访问到两个叶子。

P9058 [Ynoi2004] rpmtdq

给定一棵有边权的无根树,需要回答一些询问。

对于每一组询问,会给出 \(l,r\),你需要输出 \(\min(\texttt{dist(i,j)})\) 其中 \(l\leq i < j \leq r\)

\(n\leq2\times 10^5\)\(q\leq 10^6\)\(1\le z\le 10^9\)


考虑求支配对。

点分治之后变成一个序列,求区间 \([l,r]\) 的最小 \(a_p+a_q\)

对于 \(p\),只有后缀最小的 \(q\) 是有用的;同理对于 \(q\),只有前缀最小的 \(p\) 是有用的。

则有 \(\max(a_p,a_q)\le \min_{j=p+1}^{q-1}a_j\),对于中间的一条值域分界线,\([p,q]\) 除了两个端点都没有出现。

按照值域扫即可求出 \(\mathcal O(n)\) 个支配对,总共 \(\mathcal O(n\log n)\) 个。

处理询问是容易的。

时间复杂度 \(\mathcal O(n\log^2n+q\log n)\)

P6780 [Ynoi2009] pmrllcsrms

给你一个长度为 \(n\) 的整数序列 \(a\),和一个常数 \(c\)

\(m\) 次操作:

1 x y:将位置 \(x\) 的值修改为 \(y\)

2 l r:表示询问区间 \([l,r]\)\(\max\left(\max_{l \leq l' \leq r' \leq r\atop r'-l'+1\leq c} ~~ \left(\sum_{i=l'} ^{r'} a_i\right), 0\right)\)

\(1 \le n\le 10^6, 1\le m\le 2\times10^6, 1\le x,c\le n, 1\le l\le r\le n, -10^9 \le a_i,y \le 10^9\)


按照 \(c\) 定长分块,则块内答案对每个块维护一棵线段树即可。

考虑标准的块间答案,为三角形最大值。

分成一个矩形和上右两个三角形,发现可以分治下去,所以考虑套到线段树上,一个区间表示三角形中底边区间向上平移到斜边上得到的三角形,修改是区间加,容易维护。

时间复杂度 \(\mathcal O(m\log n)\)

P6109 [Ynoi2009] rprmq1

有一个 \(n \times n\) 的矩阵 \(a\),初始全是 \(0\),有 \(m\) 次修改操作和 \(q\) 次查询操作,先进行所有修改操作,然后进行所有查询操作。

一次修改操作会给出 \(l_1,l_2,r_1,r_2,x\),代表把所有满足 \(l_1 \le i \le r_1\)\(l_2 \le j \le r_2\)\(a_{i,j}\) 元素加上一个值 \(x\)

一次查询操作会给出 \(l_1,l_2,r_1,r_2\),代表查询所有满足 \(l_1 \le i \le r_1\)\(l_2 \le j \le r_2\)\(a_{i,j}\) 元素的最大值。

\(1\leq n,m\leq 5\times 10^4\)\(1\leq q \leq 5\times 10^5\)\(1\leq x\leq 2147483647\)\(1\leq l_1\leq r_1\leq n\)\(1\leq l_2\leq r_2\leq n\)


思考,如果是 \(3-\operatorname{side}\) 矩形查询,是好做的,扫 \(x\) 轴,维护 \(y\) 轴,只需支持区间加,区间历史最大值。

不妨考虑对每个 \(4-\operatorname{side}\) 矩形找到一条直线,将其劈开成两个 \(3\operatorname{side}\) 矩形,向左向右做就能求出答案。

故对 \(x\) 轴猫树分治,考虑到一个点时需要有它左侧或右侧的全部修改。

从左往右扫,扫到 \(mid+1\) 处时全局加上极大值,就能使右侧的询问的历史最值是正确的,倒着扫一遍处理左侧的询问。

但是这样需要写撤销或者历史版本,直接对一整层同时做。

正着一次处理右区间,倒着一次处理左区间即可。

时间复杂度 \(\mathcal O(m\log^2n+q\log n)\)

P14956 字符串的迹象

P13828 [Ynoi Easy Round 2026] 寒蝉鸣泣之时·卒

P14681 [ICPC 2025 Yokohama R] Minimizing Wildlife Damage

AT_agc046_d [AGC046D] Secret Passage

QOJ11544 Colored Blocks

P6829 [IOI 2020] 植物比较

P6107 [Ynoi2010] Worst Case Top Tree

P11695 [JRKSJ ExR] 昼寝

P11820 [PA 2015] 健身房

P14463 【MX-S10-T4】『FeOI-4』呼吸之野

给出一个 \(1\sim n\) 的排列 \(a_1, \ldots, a_n\) 和常数 \(k\),保证 \(1 \le k \le n\)

共有 \(q\) 次查询,每次查询给出区间 \([l,r]\)\(x\)(保证 \(1 \le l \le r \le n\)\(1 \le x \le n\)),若一个区间长度 \(\ge k\) 且中位数 \(\ge x\),则称这个区间是好区间。求只保留 \(a_l, \ldots, a_r\) 时,有多少个极短好区间。

\(n,q\le 10^5\)


对于区间子区间问题,我们不妨弱化到固定一个端点的情况。

\([l_i,i]\) 为右端点为 \(i\) 的极短子区间,考虑 \(x\) 增大的过程,区间和减小。

则此时若出现 \(l_i\le l_j\le j<i\),将 \(i\) 删除,其后续也不会出现,这是因为首先由 \(s_i\le s_j\),则 \(>l_j\) 的左端点也是不会合法的,所以后续一直是包含关系。

那么我们记 \(tr_i\) 表示 \(i\) 作为右端点能出现在答案里的最长时间前缀,左端点 \(tl_i\) 同理。

若求出这两个信息,根据极短好区间左右端点单调,则左右端点可以一一对应,可以简单回答询问。

对于一个 \(x\),考虑递推出所有合法右端点,考察上一个合法点 \(j\)

  • 如果 \(s_i>s_j\),则 \((l_j,i]\) 一定合法,这是因为若 \((l_j,i]\)\(\ge 0\) 显然可以,否则 \((l_j,i]\)\(=-1\),也是合法的,且长度满足。
  • 如果 \(s_i\le s_j\),则 \((l_j,j]\) 中的左端点只会因为长度不够而被放弃,所以 \(j-k+1<l_i\le i-k+1\)

接下来扫描序列,维护时间轴,记时间 \(x\) 上一个右端点为 \(j_x\)(单调减),则若满足下面条件之一可以进行替换:

  • \((j_x,i]\)\(>0\)
  • 存在 \(p\in(j_x-k+1,i-k+1]\) 满足 \([p,i]\)\(\ge 0\)

因为这一次修改一定是前缀覆盖,只需对两个条件找到最大 \(x\) 即可。

对于后者,只需 \(\min_{p\in[j_x-k+1,i-k+1)}s_{p,x}\le s_{i,x}\),对每个点维护历史最值即可,覆盖之后就清空,同时由于单调性,线段树每个节点只需维护右端点的信息。

时间复杂度 \(\mathcal O(n\log n)\)

P8145 [JRKSJ R4] kth

P12044 [USTCPC 2025] Algorithm Duel

P11111 [ROI 2023] 生产计划

P11648 【MX-X8-T7】「TAOI-3」2236 A.D.

P11694 [JRKSJ ExR] 淇宝的划分

P8852 [JRKSJ R5] Concvssion

P12704 Retribution

CF771E Bear and Rectangle Strips

P14839 [THUPC 2026 初赛] 集合

P10573 [JRKSJ R8] C0mp0nents

P9986 [Ynoi2079] r2pspc

P14475 大鱼吃小鱼

Runs 小记

AT_xmascon21_c Count Me

给定一个长度为 \(N\) 的由 0,1,? 组成的字符串 \(S\)

你需要求出每个 ? 分别取 01 的每一种情况下,满足下列条件的字符串序列 \(t_0,t_1, t_2, \ldots, t_n\) 的数量之和,答案对 \(998244353\) 取模:

  1. \(t_i\) 的长度是 \(i\),也就是说,\(t_0\) 是空串。
  2. 对于所有 \(0 \leq i < n\)\(t_i\)\(t_{i+1}\) 的子序列。
  3. \(t_n=S\)

\(n\le 2\times 10^5\)


先考虑全是 ?,为了避免数重,我们加一个充要条件:每次只能删连续段末尾的数。

假设这次删掉了 \(p\),若 \(s_p=1\),那么 \(s_{p+1}=0\);同理若 \(s_p=0\),则 \(s_{p+1}=1\)

将这步综合起来,我们翻开了相邻的两个位置,保留下右边的问号,这样根据翻开那个问号的结果可以知道左边问号的结果,这样就划归到了一个 \(n-1\) 子问题,所以有 \(f_n=(n-1+2)f_{n-1}\),可得 \(f_n=(n+1)!\)

然后考虑有一些 \(0\) 的情况,简单一点,只有一段 \(0\)

CF1210G Mateusz and Escape Room

\(n\) 个人坐成一个环,第 \(i\) 个人持有 \(a_i\) 个金币,其希望自己最后保有 \([l_i, r_i]\) 个金币。

定义一次传递金币为一个人将手上的一枚金币给一位相邻的人,但大家都不想给出自己的金币,于是你要最小化传递金币的次数。

\(3 \le n \le 2 \times 10^5, l_i \le r_i \le 10^5\),保证有解。


定义 \(i\to i+1\) 的流量为 \(x_i\),则限制为 \(\forall i,a_i+x_{i-1}-x_i\in [l_i,r_i]\)

对于一组 \(x_i\),可以证明一定存在答案为 \(\sum |x_i|\) 的方案:

  • 若不存在 \(x_i=0\),可以将一枚金币顺/逆时针转一圈同时修改。

  • \(x_i=0\) 相当于这条边可以删去,变成若干链,一定存在点只有出边,操作后将边删去(一定合法)。

考虑固定 \(x_0=c\),则可以 dp\(f_{i,k} = \min_{a_i + j - k \in [l_i, r_i]}\{f_{i - 1, j}\} + |k|\),最后答案为 \(f_{n,c}\)

归纳得知 \(f_i\) 为分段凸函数:

  • \(f_{i−1,j}\) 贡献到 \(f_{i,k}\) 当且仅当 \(j\in [l_i−a_i+k,r_i−a_i+k]\),先对极值点分析得到相当于将其左右延长,再对左右图像分析相当于向左向右平移,本质上就是中间拼上一段极小值段。

  • 对于 \(|k|\),本质就是 \(x=0\) 左侧斜率 \(-1\),右侧 \(+1\)

维护对顶堆,前者就是全局平移,后者就是插入两个斜率点,扔到堆里即可。

不妨猜测存在整数最优解。

我们发现 \(\frac{F(p)+F(q)}{2}\ge F(\frac{p+q}{2})\),这是因为 \(p\)\(q\) 的方案取平均之后依然合法,且 \(|\frac{p+q}{2}|\le \frac{|p|+|q|}{2}\)

故三分 \(c\) 即可做到 \(\mathcal O(n\log n\log V)\)

QOJ15059 CCPC 2025 Jinan H: Hashing

QOJ15041 CCPC 2025 Jinan J: 记忆, 排列与有根树

给定一棵有根树和一个排列。

对树上节点 \(𝑢\),称其子树内一个节点 \(𝑣\) 是重要的,当且仅当在排列中,\(𝑣\) 的出现位置在 \(𝑢\) 的前面。

\(𝑑_𝑢\) 为所有对 \(𝑢\) 重要的节点和 \(𝑢\) 的距离最小值,若没有则为 \(\inf\)

给定有根树和 \(𝑑_𝑖\) 序列,求出字典序最小的排列使得通过上述方法可以算出对应的 \(d_𝑖\) 序列,或者指出这样的排列不存在。

\(n\le 5\times 10^5\)


好题啊!!!

这个限制其实就是拓扑序。

限制等价于:

  • \(u\) 子树距离 \(<d_u\) 的点,从 \(u\) 连向他。
  • \(u\) 子树距离 \(=d_u\) 的点,需要任意选择一个连向 \(u\)

先将所有第一类边连接,此时所有边都是树上的祖先后代边,那么只需要保证每条第二类边连上去不会形成环,那么所有第二类边同时连上去也不会形成环。

先优化一类边的连接,对于一个点,找到所有连向他的祖先,则任意两两祖先也有边相连,这是一个完全图的形式,可以缩成一条链。

那么,每个点只需要找到其祖先路径上最深且需要连边的点连边即可。

对于第二类边,我们可以在按照字典序贪心拓扑排序的过程中实时决策。

\(V_u\)\(u\) 子树距离为 \(d_u\) 的点集。

对于此时无入度的点集 \(S\) 中的一个点 \(u\),其 \(V_u\) 所有点还未加入,那么 \(u\) 不能加入。

取能加入的最小点 \(v\) 加入即可,然后解锁他所对应的点,具体地,若 \(v\in V_p\),则可以用 \(v\) 解锁 \(p\),由于此时 \(p\) 未加入 \(v\) 已加入,所以不可能存在 \(p\to v\) 的路径,也就没有环。

显然所有 \(v\in V_p\) 构成包含关系,直接找不太好找。

考虑对同一深度所有点同时考虑,存在 \(v\in V_p\)\(p\) 构成一棵(虚)树!!!并查集找即可。

另外一种方法是:对每个重链每种 \(dep_u+a_u\) 维护一个数组,每次操作相当于找 \(\log\) 条重链的某个 \(dep_u+a_u\) 的前缀中未被解锁的点解锁,均摊正确。

时间复杂度 \(\mathcal O(n\log n)\)

QOJ6508 CCPC Final 2022 H: This is not an Abnormal Team!

QOJ4788

QOJ4243

QOJ8085

QOJ833

卡特兰数的自卷积

\(C_n\) 表示 \(n\) 个左括号,\(n\) 个右括号的合法括号序列个数,则有:

\[\begin{cases} C_0=1\\ C_n=\sum_{i=0}^{n-1}C_i\times C_{n-i-1} \end{cases} \]

这个卷积的意义是取出最外层括号 \((...)(...)(...)\),分为前面若干括号(可能为空)和最后一个括号,枚举前面用了 \(i\) 对,剩下最后一部分只能填 \(n-i-1\) 对。

\(F(x) = \sum_{n\ge 0}C_nx^n\),则我们可以写出这样的转移:

\[F(x) = 1+xF^2(x) \]

因此计算 \([x^n]F^2(x)\) 是容易的,因为 \(xF^2(x)=F(x)-1\),所以 \([x^n]xF^2(x)=C_n-[x=1]\),而 \([x^n]F^2(x)=[x^{n+1}]xF^2(x)=C_{n+1}\)

下面我们来考虑通过组合意义研究 \([x^n]F^{m}(x)\) 的真实值。

考虑这样一个问题:

问长度为 \(2n\) 的,最外层恰有 \(m\)\((...)\) 的合法括号串数。 其中 \(1\le m\le n\)

我们钦定了外层有 \(m\)(...),现在要做的就是将剩下的 \(n-m\) 对括号,可空地分成 \(m\) 个合法括号串。

因此这个问题的答案实质上就是 \([x^{n-m}]F^{m}(x)\)

\(m\) 对括号里面的串分别记作 \(S_1,S_2,...,S_m\),则 \(\text{(\)S_1\()(\)S_2\()...(\)S_m\()}\) 就是我们要计数的一个串,它和 \(\text{(((...(\)S_1\()\)S_2\()...)\)S_m\(}\) 这样的串一一对应。

对于转化后的问题:我们在 \((n-1)\times (n-1)\) 的网格图上考虑,则相当于先一口气向右走 \(m-1\) 步然后走到 \((n-1,n-1)\) 且中途不经过 \(y=x+1\) 这条折线的方案数。

\((0,0)\)\((n,m)\),始终不与 \(y=x+l,y=x+r\) 相交的格路数量为 \(\sum_k \binom{n+m}{n-k(r-l)}-\binom{n+m}{n-k(r-l)+r}\)

对称即可。

因此方案总数是 \(\dbinom{2n-m-1}{n-1}\),而不合法方案数是 \(\dbinom{2n-m-1}{n}\)

所以上述问题的答案,也就是 \([x^{n-m}]F^m(x)\) 即为 \(\dbinom{2n-m-1}{n-1}-\dbinom{2n-m-1}{n}\)

因此,不难得到:

\[[x^n]F^m(x) = \dbinom{2n+m-1}{n+m-1}-\dbinom{2n+m-1}{n+m} \]

区间线性基

每个数以 \(\frac{1}{2}\) 概率算进异或和,做 $\log $ 轮。

对 $\log $ 个异或和构造线性基,极高概率正确。

平面最近点对

对于第 \(i\) 个数,其为前缀最大值的概率为 \(\frac{1}{i}\)

考虑随机重排之后按顺序加入所有点,动态维护任意时刻的最近距离。假设前 \(i\) 个点的最近点对距离为 \(d\)

那么把平面分成若干 \(d\times d\) 的小正方形构成的网格,那么能够发现一个小正方形中只会有 \(\mathcal O(1)\) 个点。那么第 \(i+1\) 个点加入的时候只需要其所在正方形周围的 \(3\times 3\) 范围内的正方形里的点即可。

如果答案更新了就需要重构正方形网格。根据上面的分析,第 \(i\) 个点更新答案的概率是 \(\frac{1}{i}\),因此期望复杂度为 \(\mathcal O(\sum i\times \frac{1}{i})=\mathcal O(n)\)

P11810 [PA 2017] 商旅

给定一个 \(n\times m\) 的网格,有若干 KW,剩余为空地。

\(q\) 次操作,要求支持将某个 K 移动到相邻空地上,以及给定空地 \((x,y)\),判断若将 \((x,y)\) 变为 W,所有 K 是否可在不经过 W 的前提下连通,若是则将 \((x,y)\) 变为 W

强制在线,\(n,m\le 10^3,q\le 10^6\)


尝试将断边连起来,那么 \(x,y\) 连通当且仅当其在不存在一个闭合图形使得 \(x,y\) 一个在内部一个在外部。

判断一个点是否在闭合图形内部,常见做法是向右引一条射线,条件为经过闭合图形奇数次。

考虑异或哈希,给每个点一个权值,对每条边记录射线经过他的点的权值异或和,那么条件为一个闭合图形的所有边的异或和为 \(0\) 或者全集。

显然闭合图形就是一个环,根据 \(0\)\(V\) 的特殊性,我们只需判断所有非树边构成的环,故可以并查集维护。

但是修改操作上下移动会影响很多东西,但是你可以发现将射线扩展为任意折线(可以往回走)也是可行的,移动是就将折线起点跟着移动,每次只会多经过一条边。

每次加入的四条边一旦有任意一条发现不合法,四条边全部都不能加入,所以需要用可撤销并查集维护。

时间复杂度 \(\mathcal O(nm+q\log(nm))\)

P11423 [清华集训 2024] 阿尔塔尔 2

竞赛图中一定存在点,使得它到任意一点的最短路不超过 \(2\)

增量构造。

P9312 [EGOI 2021] Lanterns

P12084 [Ynoi1998] ZYPRESSEN

拟阵贪心

拟阵交还没学。

对于一个集合 \(M\),定义集合族为其若干个子集构成的集合。对于 \(M\) 的一个子集族 \(\mathcal{I}\),若满足:

  • (含空性)\(\emptyset \in \mathcal{I}\)
  • (继承性)若 \(B \subseteq A \in \mathcal{I}\),则 \(B \in \mathcal{I}\)
  • (交换性)若 \(A, B \in \mathcal{I}\)\(|A| < |B|\),那么存在 \(b \in B \setminus A\) 使得 \((A \cup \{b\}) \in \mathcal{I}\)

则称 \((M, \mathcal{I})\) 是一个拟阵。定义 \(\mathcal{I}\) 中的所有元素为独立集。

对于一个拟阵 \((M, \mathcal{I})\),我们为所有 \(x \in M\) 设置非负权值 \(w_x\)。我们需要找到集合 \(A \in \mathcal{I}\),且最大化 \(\sum_{x\in A} w_x\)

算法如下:

  1. \(M\) 排序为 \(\{x_1, \ldots, x_m\}\),使得 \(w_{x_i} \ge w_{x_{i+1}}\)
  2. \(A \leftarrow \emptyset\)
  3. \(i = 1\)\(m\)
    • \(A + \{x_i\} \in \mathcal{I}\),则 $A \leftarrow A+
  4. 返回 \(A\)

该算法的时间复杂度为 \(\mathcal O\bigl(m(\log m + T)\bigr)\),其中 \(T\) 为判断 \(A \in \mathcal{I}\) 的复杂度。

\(A\) 中元素按权值从大到小为 \(a_1, a_2, \ldots, a_k\),最优解为 \(B = \{b_1, \ldots, b_k\}\)。我们只需证明 \(w_{a_i} \ge w_{b_i}\)
考虑集合 \(A_{r-1} = \{a_1, \ldots, a_{r-1}\}\)\(B_r = \{b_1, \ldots, b_r\}\)
由交换性可得,存在 \(b_j \in B_r \setminus A_{r-1}\),满足 \(A_{r-1} \cup \{b_j\} \in \mathcal{I}\)
因此,\(w_{a_r} \ge w_{b_j} \ge w_{b_r}\)

P10001 [集训队互测 2023] 优惠购物

给定 \(n\) 个物品和常数 \(c\),你要按顺序购买每个物品,初始有 \(m\) 个优惠券。

对于第 \(i\) 个物品,你要花费总计 \(a_i\) 个金币或优惠券,其中优惠券至多用 \(b_i\) 张,假设当前使用 \(x_i\) 张优惠券,则购买结束你可以获得 \(\lfloor\frac{a_i-x_i}{c}\rfloor\) 张优惠券(向下取整)。

最小化花费的金币总数。

\(n\le 10^6, V\le 10^9\)


考虑用数学语言描述这个过程。

\(x_i\) 表示用了几张券,\(s_i\) 表示买完前 \(i\) 个物品之后剩了几张券,则条件为 \(s_{i-1}\ge x_i\),要求最大化 \(\sum x_i\),并且有 \(s_0=m,s_i=s_{i-1}+\lfloor\frac{a_i-x_i}{c}\rfloor\)

我们不妨令初始所有 \(x_i=0\),不断增加 \(x_i\),并描述 \(s_i\) 的变化,令 \(s’_i=s_{i-1}-x_i\),则可以分成三个阶段:

  1. \(a_i\bmod c\) 张,\(s'_{j\ge i}-1\)
  2. 不断取完整的 \(c\) 张,\(s'_i-c,s'_{j>i}-(c+1)\)
  3. 最后取一次(可能没有)\(z\in [1,c)\) 张,\(s'_i-z,s'_{j>i}-(z+1)\)

在确定了每种操作的贡献和代价后,不难发现操作类型的先后顺序可以不作要求。

  • 若存在 \(j\) 没取满操作一且他前面存在操作一,则可以调整过来,所以一定是后缀取满操作一,剩一个单的。
  • 如果一种方案只看操作一时还能进行操作,设位置 \(p\) 还能进行操作一,从后往前找到第一个存在其他操作的位置 \(k>p\),将 \(k\) 的操作调整到 \(p\) 显然更优,所以我们操作一的方案是固定的,从后往前贪心做即可。
  • 操作二三的影响是类似的,只是次数限制略有不同。
  • 如果存在 \(j\) 还能取,且他前面存在权值相同的操作,那么可以调整过来,所以此时一定是后缀空位取满这种操作。
  • 如果一种方案只看权值 \(\ge k\) 的操作时还能进行操作,设位置 \(p\) 还能进行操作,从两边开始收集对应权值,肯定能填进来。

所以按照权值从大到小,从后往前贪心取操作即可。

操作二因为可以用多次,所以单独拉出来扫。

考虑优化操作三,因为每个位置可操作次数一定是递减的,所以我们每次拿出最大权值且最右的操作即可。

观察可操作次数 \(\min\bigl(b_i-x_i,\min(s'_{i},\min_{j>i}s'_j-1)\bigr)\),发现后半部分是单增的,所以按照 \(b_i-x_i\) 从大到小加入 \(i\),当分界线在两个离散化值之间时,最大值一定是之前还没操作的最右位置,拿个堆维护即可,注意需要判断这个最大值是否在下个离散化值之上。

时间复杂度 \(\mathcal O(n\log n)\)

P4499 [CTSC2011] 无穷图的桥

求一个点数无穷的无向图的桥。

这个无向图具有如下性质:

  1. 这个图是一个连通图。

  2. 这个图的所有节点分为若干层,每层共有 \(n\) 个节点。

  3. 同一层内的节点可以相互连边,相邻两层的节点之间可以相互连边。

  4. 如果 \((i, x)\)\((i, y)\) 之间有一条权值为 \(d\) 的边,那么 \((j, x)\)\((j, y)\) 之间也有一条边,它的权值为 \(0.9^{j-i}d\)

  5. 如果 \((i, x)\)\((i + 1, y)\) 之间有一条权值为 \(d\) 的边,那么 \((j, x)\)\((j+1, y)\) 之间也有一条边,它的权值为 \(0.9^{j-i}d\)

\(n\le 3\times 10^5,m_1,m_2\le 5\times 10^5\)


?????????

P14832 [THUPC 2026 初赛] Unpair Ampere

给定 DAG。记无入度的结点构成集合 \(S\),并给出 \(S\) 的一个初始划分 \(S = S_y \cup S_z\)

给定每个点的价值 \(a_i\),求一个最优划分 \(S'_y,S'_z\) 使得同时连接到 \(S′_y\)\(S′_z\) 的结点以及与原划分不同的结点的 \(a_i\) 之和最小。

可以理解为:每个划分本身都有一个代价,修改划分也需要付出相应的代价,最小化总代价。

\(N\le 5000, M\le 50000\)


碰到一个类似的题没想到,所以来写一下题解。

考虑最小割:

  • 对原图边连 \((u,v,\inf),(v+n,u+n\inf)\)
  • 对后面的点,连 \((u,u+n,a_u)\),表示花费 \(a_u\) 代价删去与 \(u\) 有关的限制。
  • 对于 \(S_y\) 内的点,连 \((S,u,V+a_u),(u+n,T,V),(u,u+n,\inf)\),其中 \(V\) 为极大值,这样可以保证两条边恰好选一条割去,不产生限制。
  • 对于 \(S_z\) 同理。

截止日期

给出一个二分图,其中左部点有两类。

你需要为每个右部点保留一种指向类型的边,使得最大匹配最小。

\(n\le 2000,m\le 5000\)


\(\min,\max\) 内外层不同可以考虑转成相同的,这样就能进行拆括号或者其他操作。

不妨将最大匹配转成最小点覆盖。

这样要求一条边的两个端点至少选一个。

\(u_1,u_2\) 表示右部点。

连边 \((S,S_y,1),(S_z,T,1),(S_y,u_1,\inf),(S_z,u_2,\inf),(u_1,u_2,1)\)

意义就是要么割 \((u_1,u_2)\),表示选了 \(u\),这样他选什么类型都行,他的限制也被删去。

否则,要求 \(u\) 必须至少一侧连向的点全部选上,发现这个图恰好满足!!

P10461 【模板】多项式复合集合幂级数

P9499 「RiOI-2」change

AT_arc213_c [ARC213C] Double X

给你两棵树 \(A,B\),以及一个正整数权值序列 \(C\)

对每个 \(k\),选择四个不同且不同于 \(k\) 的点:

  • \(A\) 中以 \(k\) 为根的每个子树选择点数 \(\le 1\)
  • \(B\) 中以 \(k\) 为根的每个子树选择点数 \(\le 1\)
  • 最小化权值总和。

\(n\le 10^5,1\le A_i\le 10^9\)


找到 \(A\)\(k\) 的每个子树里在 \(B\) 的不同子树里的最小权值,只需保留前四大。

对于 \(A\) 的轻子树信息,直接枚举。

对于 \(A\) 的重子树和父亲方向,是 \(\mathcal O(1)\) 个 dfn 区间。

再枚举 \(B\) 的每个子树,线段树合并出子树内 \(A\) 的 dfn 区间的信息,对于父亲方向,是关于 \(B\) 的 dfn 前后缀,可以用主席树维护。

求出信息后,你发现这就是个二分图匹配,左右每个点只需保留前 \(4\) 大的边,直接暴力流即可。

时间复杂度 \(\mathcal O(n\log^2n)\)

另外:选择两个集合在大值域上不交,可以考虑随机映射到小值域上做,多做几次概率很大。

posted @ 2026-01-06 15:48  蒟蒻orz  阅读(38)  评论(0)    收藏  举报