2026.11 做题记录
2026.11.2
P15133 [ROIR 2026] 最后的滑动窗口问题
对 \(u\) 维护 \(L_u,R_u\) 表示左边第一个小于等于 \(a_u\) 的位置加 \(1\),右边第一个小于 \(a_u\) 的位置减 \(1\)。
考虑 \(u\) 对 \((l,k)\) 的贡献。显然,贡献为:对 \(i\in [L_u,u]\),\(k\in [u-i+1,R_u-i+1]\) 的 \((l,k)\) 产生 \(a_u\) 的贡献。
以 \(l\) 为横坐标,\(k\) 为纵坐标。贡献可以看作是一个平行四边形。
考虑把平行四边形补成矩形,再除去两个三角形的贡献。也就是:
- 对以 \((L_u,1)\) 为左下角,\((u,R_u-L_u+1)\) 为右上角的矩形中每个点增加 \(a_u\) 的贡献。
- 对由 \((L_u,1),(L_u,u-L_u),(u-1,1)\) 构成的直角三角形中每个点减少 \(a_u\) 的贡献(可能不存在)。
- 对由 \((L_u+1,R_u-L_u+1),(u,R_u-L_u+1),(u,R_u-u+2)\) 构成的直角三角形中每个点减少 \(a_u\) 的贡献(可能不存在)。
将询问拆成对 \(l\) 的前缀查询。然后对 \(k\) 扫描线。
第二类可以看作是对 \(x \le l \le y-k\) 的 \((l,k)\) 做加法操作。此时贡献形如 \(v \times |[x,y-k]\cap [1,p]|\),其中 \(v\) 为加法操作的值,\([1,p]\) 为一个查询前缀。有 \(|[x,y-k]\cap [1,p]| = \min(y-k,p) - \min(x-1,p)\)(这里要排除 \(x > y-k\) 的情况,这个相当于每个 \((x,y)\) 都有一个存在时间)。后者直接树状数组,前者讨论大小:
- \(y \ge p+k\)。贡献为 \(p\)。
- \(y < p+k\)。贡献为 \(y-k\)。
也是树状数组维护。
第三类同理可以看作对 \(y-k\le l \le x\) 的 \((l,k)\) 做加法操作。同样拆成 \(\min(x,p) - \min(y-k-1,p)\)。对后者讨论大小。
时间复杂度 \(O(n\log n)\)。
P15088 [UOI 2025 II Stage] Digital Game
注意到 \(n \ge 2|\sum|\) 时一定不能战胜 Us。
考虑证明 \(n = 2|\sum |,n = 2|\sum|+1\) 时不行,\(n > 2|\sum|+1\) 的情况一定在不断删两个数的过程中变成这两个之一。
- \(n = 2|\sum|\)。
- 所有数均出现 \(2\) 次。那么后手跟着先手删,一定可以达到 \(n = 2|\sum| =2\) 的局面。此时 Us 赢。
- 存在一个数出现至少 \(3\) 次。如果先手删出现 \(2\) 次的,后手就跟着删;如果先手删出现 \(1\) 次的,后手就删出现至少 \(3\) 次的;如果先手删出现至少 \(3\) 次的,后手就删出现 \(1\) 次的。这样一轮之后依旧满足 \(n = 2|\sum|\)。此时 Us 赢。
- \(n = 2|\sum|+1\)。
- 存在数出现 \(1\) 次。先手或后手一定会有一个删它。之后仍然满足 \(n = 2|\sum|+1\)。
- 所有数出现至少 \(2\) 次。此时一定存在一个数出现奇数次。出现奇数次的数数量要么不变,要么减少 \(1\),最后在 \(n=3\) 时一定出现两个相同的数相邻。此时 Us 赢。
对于 \(n \le 19\) 的情况,状压即可。时间复杂度 \(O(Tn2^n)\)。
P9393 紫丁香
拆位,看每一位能不能是 \(1\)。
相当于给定集合 \(S\),问能否在若干次操作后使得 \(S\) 内所有二进制为均为 \(1\)。
倒着推。把 \(S\) 外的二进制位看成 \(?\),即通配符。
考虑一个状态 \(t\) 可以被哪些状态 \(s\) 通过 \(T\) 推出来。分情况讨论:
- \(T_i = 0\)。此时要求 \(t_i \ne 1\)。\(s_i = ?\)。
- \(T_i = 1\)。此时要求 \(t_i \ne 0\)。\(s_i = ?\)。
- \(T_i = -\)。此时要求 \(t_i = s_i\)。
相当于只要 \(T\) 和 \(t\) 匹配(除开 \(T_i = -\) 的部分),\(s\) 就相当于 \(t\) 将所有 \(T_i \ne -\) 的二进制位变成统配符。
因为初始 \(S_i\in \{?,1\}\),所以 \(T_i = 1\) 的要求自然满足了。
那么操作相当于,每次选择一个 \(T\),要求不存在 \(T_i =0\land t_i =1\)。然后将所有 \(T_i = 1\) 的二进制为对应 \(t_i\) 改成通配符。问操作若干次后能否与初始二进制数匹配。
那么维护 \(g(S)\) 为满足 \(\not \exist i\in S, T_{x,i} = 0\) 的 \(\{i| T_{x,i}=-\}\) 交集。定义 \(f(S)\) 表示如果初始时只有 \(i\in S\) 的 \(i\) 满足 \(t_i = 1\),操作若干次后 \(t_i = 1\) 的 \(i\) 构成的集合。那么转移为:\(f(S) = f(g(S))\)。特别的,若 \(g(S) = S\),则 \(f(S) = S\)。
这样判定给定的集合 \(S\) 是否合法,就可以直接看 \(f(S)\) 与初始二进制数是否匹配了。
维护 \(g(S)\) 相当于是一个高维后缀与,\(f(S)\) 的转移是 \(O(1)\) 的,判定合法也是 \(O(1)\) 的。
整体时间复杂度 \(O(n+m2^m+qm)\)。
P8702 [蓝桥杯 2019 国 B] 燃烧权杖
记 \(X = \lceil\frac{x}{10}\rceil,Y = \lceil\frac{y}{10}\rceil\)。
显然,士兵是没有用的,因为攻击士兵对二元组 \((X,Y)\) 不产生影响。
问题变成每次等概率将 \(X\) 或 \(Y\) 减少 \(1\)。问 \(Y\) 在 \(X\) 之前减到 \(0\) 的概率。
设 \(Y\) 减到 \(0\) 时操作了 \(n\) 次。那么满足 \(n < X+Y\),概率为 \(\frac{\binom{n-1}{Y-1}}{2^n}\)。
那么答案就是 \(\sum\limits_{n=(Y-1)}^{X+(Y-1)}\frac{\binom{n}{(Y-1)}}{2^{n+1}}\)。这个也可以写成 \(\frac{1}{2^{X+(Y-1)}}\sum\limits_{i=0}^{X-1}\binom{X+(Y-1)}{i}\)。相当于取到 \(Y\) 操作到 \(0\) 的时刻,前面对应一种操作,后面无论怎么取都是合法的,与概率和为 \(1\)。
记 \(n = X+(Y-1),m = X-1\)。问题变成求 \(\frac{1}{2^n}\sum\limits_{i=0}^{m}\binom{n}{i}\)。
\(\binom{n}{m}\bmod p = \prod\binom{n_i}{m_i}\bmod p\),其中 \(n_{1\sim k},m_{1\sim k}\) 分别为 \(n,m\) 的 \(p\) 进制表示。
那么用数位 DP 就就可以了。时间复杂度 \(O(Tp\log_p x)\)。
2026.11.3
CF1601D Difficult Mountain
先去掉那些 \(s_i < d\) 的人,因为他们一定无法成功登山,且把他们放最后对其他人不产生影响。
再去掉 \(a_i < d\) 的人,把他们放最前面一定不劣。
将剩下的人按 \(a\) 升序排序,\(a\) 相同按 \(s\) 降序排序。
记成功登山且改变了难度的人依次为 \(q_{1\sim k}\)。满足 \(d < a_{q_1}<a_{q_2}<\dots<a_{q_k}\)。那么一个简单的想法是:既然其它人不改变难度,为了让他们尽可能能成功登山,就应该排在第一个 \(a_{q_i} > a_x\) 的人 \(q_i\) 之后,\(q_{i+1}\) 之前。
即顺序应该是:\(q_1,[1,q_{1}-1],q_2,[q_{1}+1,q_2-1],q_3,\dots,q_k,[q_{k-1}+1,q_k-1],[q_k+1,n]\)。因为 \(q_k\) 是最后一个改变了难度的人,所以钦定 \(i\in [q_k+1,n]\) 均未成功登山。
定义状态函数 \(f_i\) 为考虑完 \([1,i]\) 中的人,且 \(i\) 是最后一个成功登山的人时,成功登山人数最大值。令 \(a_0 = d\)。
转移为:\(f_i =\max\limits_{j=0}^{i-1}(f_j +1+ \sum\limits_{k=j+1}^{i-1}[s_k \ge a_i])[s_i \ge a_j]\)。
初始化 \(f_{0}=0\),答案为 \(\max\limits_{i=0}^{n}f_i + \Delta\)。其中 \(\Delta\) 为 \(a_i < d\) 的人产生的贡献。
直接线段树维护就行了。\(\sum [s_k \ge a_i]\) 相当于是对每个 \(k\) 有个存在时间区间,在这个区间内会额外对 \(j < k\) 产生 \(1\) 的贡献。
时间复杂度 \(O(n\log n)\)。
QOJ6842 Popcount 单词
对 \([0,2^{30}-1]\) 建 Trie(从高位往低位)。一个叶子的权值为从根走到它过程中,向右走的次数奇偶性。
显然,叶子的权值恰好就是 \(\text{popc}(x)\bmod 2\) 的结果。
对于区间 \([l,r]\),可以拆成 \(O(\log V)\) 个完整子树。
不难发现,如果记从下往上第 \(i\) 层(不包括叶子),从左往右第一个子树为 \(S_i\),那么有 \(S_1 = 01,S_i = S_{i-1}+\text{rev}(S_{i-1})\)。且第 \(i\) 层中所有子树均能表示成 \(S_i\) 或 \(\text{rev}(S_{i})\)。
对模式串建 AC 自动机。维护 \(nxt(u,i,0/1)\) 表示从点 \(u\) 开始,在 AC 自动机中走完 \(S_i\) 或 \(\text{rev}(S_i)\) 后到达的点。有:
- \(nxt(u,i,0) = nxt(nxt(u,i-1,0),i-1,1)\)。
- \(nxt(u,i,1) = nxt(nxt(u,i-1,1),i-1,0)\)。
初始状态:
- \(nxt(u,0,0) = out(u,0)\)。
- \(nxt(u,0,1) = out(u,1)\)。
那么对于给定的 \(n\) 个区间 \([l_i,r_i]\),每个都拆成 \(O(\log V)\) 个子树后从左往右遍历,就可以得到形如对从 \(u\) 开始,在 AC 自动机中走 \(S_i\) 或 \(\text{rev}(S_i)\),并对中途经过的每个点 \(v\),将 fail 树上 \(v\) 到根路径权值加 \(1\) 的操作。
维护 \(tag(u,i,0/1)\) 表示从点 \(u\) 开始,在 AC 自动机中走 \(S_i\) 或 \(\text{rev}(S_i)\),并对中途经过的每个点 \(v\),将 fail 树上 \(v\) 到根路径权值加 \(tag(u,i,0/1)\)。
考虑标记下传。有:
- \(tag(u,i-1,0)\gets tag(u,i,0),tag(nxt(u,i-1,0),i-1,1)\gets tag(u,i,0)\)。
- \(tag(u,i-1,1)\gets tag(u,i,1),tag(nxt(u,i-1,1),i-1,0)\gets tag(u,i,1)\)。
时间复杂度 \(O((n+\sum |p_i|)\log V)\)。
QOJ1429 击中
二分答案。
记 \(s_i\) 为前缀和。那么要求形如:
- \(s_{-\infin} \ge 0\)。
- \(s_i \ge s_{i-1}\)。
- \(1\le s_{r_i} - s_{l_i-1}\le x\)。
差分约束连边:
- \((i-1)\to i\),边权为 \(0\)。
- \(r_i\to (l_i-1)\),边权为 \(-x\)。
- \((l_i-1)\to r_i\),边权为 \(1\)。
直接跑是不是就可以了。卡卡能过。
P15925 [TOPC 2023] Introversion
将颜色分成 \(3\) 类,分别是出现过 \(0,1,2\) 次。记它们的数量分别为 \(A,B,C\)。
容斥,记 \(G(x,y)\) 为钦定有 \(x\) 对相邻位置是第 \(1\) 类颜色且颜色相同,有 \(y\) 对相邻位置是第 \(2\) 类颜色且颜色相同的方案数。
那么答案为:\(\sum\limits_{x\ge 0}^{}\sum\limits_{y\ge 0}^{} (-1)^{x+y}G(x,y)\frac{(2A-2x + B-y)!}{2^{A-x}}\)。
定义 \(g_i(x,y)\) 为考虑完位置 \([1,i]\) 的方案数。转移为:
- \(g_i(x,y)\gets g_{i-1}(x,y)\)。
- 若 \(x_i=0,x_{i-1}=0\)。\(g_i(x+1,y)\gets g_{i-2}(x,y)\times (A - x)\)。
- 若 \(x_i = 0,x_{i-1}\ne 0\) 或 \(x_{i}\ne 0,x_{i-1}=0\) 且非 \(0\) 的那个颜色是第 \(2\) 类。\(g_i(x,y+1)\gets g_{i-2}(x,y)\)。
时间复杂度 \(O(Tn^3)\)。
P8885 「JEOI-R1」子序列
对于一个字符串的不同子串数量,转移为:
只要 \((f_{|s|,0}+f_{|s|,1})\bmod 2=0\) 就说明这个子串 \(s\) 是好的。
将 \(f_{i,j}\) 对 \(2\) 取模,有:
那么就可以用两个 \(01\) 来表示状态 \((f_{0},f_{1})\) 了。
把它看成一个两位的二进制数,用十进制表示成 \(0\sim 2\)(显然,状态 \(3\) 永远不会存在)。记 \(\text{nxt}(x,0/1)\) 表示在状态 \(x\) 的基础上再转移字符 \(0/1\) 后得到的状态。
维护状态函数 \(g_{i,S,0/1}\) 表示考虑完 \(s[:i]\),且有奇数个后缀 \(s[j:i]\) 的状态 \((f_0,f_1)\) 集合为 \(S\),其子串 \(s[j:k]\) 中满足 \(f_0\oplus f_1 = 0\) 的有偶数或奇数个的方案数。
对 \(s_i\) 分情况讨论:
- \(s_i = 0\)。\(g_{i,S',(c + |S' \cap \{0\}|)\bmod 2}\gets g_{i-1,S,c}\)。其中 \(S'\) 为 \(\{\text{nxt}(x,0)|x\in S\}\) 并将 \(2\) 加入(如果不在集合中)或删除(如果在集合中)后得到的集合。
- \(s_i = 1\)。\(g_{i,S',(c + |S' \cap \{0\}|)\bmod 2}\gets g_{i-1,S,c}\)。其中 \(S'\) 为 \(\{\text{nxt}(x,0)|x\in S\}\) 并将 \(1\) 加入(如果不在集合中)或删除(如果在集合中)后得到的集合。
初始化 \(g_{0,\emptyset,0}=1\)。答案即为 \(\sum\limits_{S}g_{|s|, S,1}\)。
再压缩状态,将 \((S,c)\) 用一个五位的二进制数表示(最低位是 \(c\))。记 \(\text{Nxt}(x,0/1)\) 表示在状态 \(x\) 的基础上再转移字符 \(0/1\) 后得到的状态。那么转移方程可以写成:
初始化 \(g_{0,0}=1\)。答案为 \(\sum\limits_{x\bmod 2 = 1}^{}g_{|s|,x}\)。
对于原问题,将转移写成矩阵的形式。放猫树上询问做到 \(O(\omega ^3 n\log n + q\omega ^3),\omega = 16\)。注意到转移矩阵只有 \(O(\omega)\) 个非 \(0\) 值,所以矩阵乘法可以做到 \(O(\omega^2)\)。整体复杂度 \(O(\omega^2 n\log n + q\omega^2)\)。
P15146 [SWERC 2025] LFS
首先 \(f(t)\) 就是字符串 \(t\) 中出现次数最多的字符。
求答案考虑枚举 \(\text{LFS}(t)\) 中包含的一个字符 \(c\),给所有 \(c\) 出现的位置同时向左右拓展。直到某个时刻拓展后得到的字符串不一样为止。
显然,拓展次数是 \(O(|\sum |)\) 的。
对于相邻两个字符 \(c\),维护 \(L_i,R_i\) 表示第 \(i-1\) 和 \(i\) 个字符 \(c\),能向左向右拓展到最长长度(和 \(|\sum|\) 取较小值)。这个暴力是 \(O(n|\sum|)\) 的。
询问时枚举字符 \(c\) 后就是一个区间 \(\min\)。用 st 表做到 \(O(n|\sum| +n\log n + q|\sum|)\)。
P15316 [VKOSHP 2025] Strange Sum
记 \(W(l,r) = \sum\limits_{l \le L \le R \le r}^{} w_{L,R}\)。
从小到大枚举 \(v\),记 \(b_i = [a_i \ge v]\)。设 \(b\) 中 \(1\) 构成的连续段为 \([l_1,r_1],[l_2,r_2],\dots,[l_k,r_k]\)。贡献 \(g(v) = \sum\limits_{i=1}^{k}W(l_i,r_i)\)。
那么 \(f(a) = \sum\limits_{v=1}^{+\infin}g(v)\)。
把某个 \(v\) 贡献的一个由 \(1\) 构成的连续段 \([l,r]\) 看成消耗 \(r - l + 1\) 的代价获得 \(W(l,r)\) 的贡献。
贡献可以直接写成 \(\sum\limits_{1\le l\le r \le n}^{}W(l,r)\cdot c(l,r)\),其中 \(\sum\limits_{1\le l \le r\le n}^{}c(l,r) = x\)。因为 \(w_{l,r}\ge 1\),所以对于 \(a < b < c < d\),有 \(W(b,c)+W(a,d) > W(a,c) + W(b,d)\),最优解一定不会出现相交的情况。
记 \(v_i = \max\limits_{r-l+1=i}^{}W(l,r)\)。问题变成给定 \(v_{1\sim n}\),对于所有满足 \(\sum\limits_{i=1}^{n}c_i = x\) 的非负整数数组 \(c\),求 \(\sum\limits_{i=1}^{n}c_i\cdot v_i\) 的最大值。
这个是简单的,先选性价比最大的那个,在背包剩余体积不超过 \(n^2\) 时再跑完全背包就行了。
时间复杂度 \(O(tn^3)\)。
P15110 Silent End
注意到每个人都至少被评价了一次,所以对于初始状态中 \(w\) 最小的那条评价 \((u,v,w)\),一定满足 \(a_v = w +1\)。因为如果 \(a_v = w - 1\),说明 \(a_u < a_v\)。而 \(u\) 被评价的 \(w'\) 一定满足 \(w’ \ge w\),所以不可能存在这样的情况。
那么从小到大枚举 \(w\) 即可。
时间复杂度 \(O(m\log m)\)。
P15173 [SWERC 2021] Drone Photo
注意到对于任意一个合法的矩形,都能找到两个直角三角形,使得直角顶点的值恰好处于另外两个顶点值之间(如果将这 \(4\) 个值离散化,那么这两个三角形分别就是以 \(2,3\) 为直角顶点构成的直角三角形)。且不合法的矩形一定找不到这样的直角三角形。
那么直接对这个三角形计数就行了。答案即为三角形数量的一半。
枚举直角顶点为 \((i,j)\)。相当于在第 \(i\) 行找一个比 \(a_{i,j}\) 大的点,第 \(j\) 列找一个比 \(a_{i,j}\) 小的点或者在第 \(i\) 行找一个比 \(a_{i,j}\) 小的点,第 \(j\) 列找一个比 \(a_{i,j}\) 大的点。
那么按照值从大到小加入点。维护 \(f_{i},g_i\) 表示第 \(i\) 行,第 \(i\) 列已经被加入的点数量即可。
时间复杂度 \(O(n^2)\)。
P17302 [ICPC 2026 Xi'an I] VIP Coupon
先删掉 \(b \ge c\) 的物品。
考虑 \(c\) 大的匹配 \(a\) 大的不劣。
那么按照 \(c\) 从大到小枚举优惠券,每次取出当前代价最大的物品 \(a\)。若 \(b +\max(0,a-c)\le a\),就使用这张优惠券,并将 \(b\) 也看作一个物品。
时间复杂度 \(O(n\log n)\)。
AT_utpc2023_p Priority Queue 3
深刻,搓了十分钟调两个小时。
先考虑状态函数怎么定义,具体要维护什么。
模拟整个过程,任意时刻队列中元素分成两类:
- 之后不会弹出的元素。
- 之后会弹出的元素。
对于一个第一类元素,不妨设加入它时已经弹出的 \(A\) 中元素集合为 \(B\)。那么它的值 \(v\) 应该满足:\((v > \max\limits_{x\in A\setminus B}^{}x) \land (v\notin A)\)。
由这个可以相当记录任意时刻的 \(\max\limits_{x\in A\setminus B}^{}x\)。
既然已经知道 \(\max\limits_{x\in A\setminus B}^{}x\) 了,\(B\) 中 \(>x\) 的元素就也已知了,\(<x\) 的元素显然是不重要的(因为合法的插入元素顺序唯一对应弹出顺序)。
考虑定义状态函数 \(f_{i,j,k,0/1}\) 表示考虑完前 \(i\) 个操作,当前 \(\max\limits_{x\in A\setminus B}^{}x=A_j\),已经 \(B\) 中小于 \(x\) 的元素和队列中第二类元素数量共 \(k\) 个,且 \(A_j\) 是否在队列中的方案数。
记 \(c_i,d_i\) 分别表示前 \(i\) 个操作中弹出操作和插入操作的数量。
对于一个状态 \((i,j,k,s)\),记 \(X\) 表示队列中第二类元素数量,\(Y\) 表示队列中第一类元素数量,\(Z\) 表示 \(B\) 中大于 \(A_j\) 的元素数量,\(W\) 表示 \(B\) 中小于 \(A_j\) 的数量。有以下等式关系:
- \(s+X+Y+Z+W=d_i\)。
- \(Z =m-j\)。
- \(X + W =k\)。
- \(Z+W = c_i\)。
由此可以解出 \(X,Y,Z,W\)。
那么转移就是简单的了。时间复杂度 \(O(n^3)\)。
P14231 复读机 / repeat
设答案为 \(x\)。
把数分成两类:
- \(2a_i \le x\)。记为 \(A\) 类。
- \(2a_i > x\)。记为 \(B\) 类。
那么合法子序列一定形如:\(A\dots, A ,B,A,\dots, A,B,A,\dots ,A,\dots\)。
最大长度也就是 \(A\) 类点数量加上可插入 \(B\) 类点数量。
从小到大枚举 \(x\),考虑每个点的贡献。
- 对于 \(i\),当 \(x\in [2a_i,+\infin)\) 时会产生 \(1\) 的贡献。即对 \(l\in [1,i],r\in [i,n],x\in [2a_i,+\infin)\) 产生 \(1\) 的贡献。
- 对于某时刻相邻两个 \(A\) 类点 \(i,j\)。记 \(v\) 为区间 \((i,j)\) 的最小值。那么会对 \(l\in [1,i],r\in [j,n],x\in [v + \max(A_i,A_j),2v)\) 产生 \(1\) 的贡献。
显然,这样的贡献对只有 \(O(n)\) 个。
对询问整体二分。
注意到 \(x\) 一定时,对于任意一个询问 \((l,r)\),满足 \(l\in [1,i],r\notin [j,n],x\in [v + \max(A_i,A_j),2v)\) 的 \((i,j)\) 只有最多一个。所以贡献对实际上可以写成 \((i,L,R)\),表示当 \(l\in [1,i],x\in [L,R]\) 时产生 \(1\) 的贡献。这样 \(x\) 一定时询问区间 \([l,r]\) 的贡献直接就是区间和,再看 \([l,r]\) 中最右边一个满足 \(2a_i \le x\) 的是否多算了 \(1\) 的贡献即可(左边同理)。
时间复杂度 \(O(n\log^2 n)\)。
2026.11.5
P10159 [DTCPC 2024] The last permutation
考虑从 \(1,n\) 两个点开始往中间确定排列。
设当前已经知道了 \(p_{1\sim l-1},p_{r+1\sim n}\)。现在需要确定 \(p_{l}\)。
如果知道区间 \([a,b]\) 中包含哪些数,是可以通过比较 \([a+1,b]\) 中第 \(k\) 大和 \([a,b]\) 中第 \(k\) 大的大小来缩小 \(p_a\) 的范围。
那么此时有两种方式:
- 查询 \([l+1,n]\)。因为 \(p_{1\sim l-1},p_{r+1,n}\) 一定确定了,所以 \(p_l\) 的可能值也是已知的。二分答案,代价 \(\frac{\log(r-l+1)}{n-l}\)。
- 查询 \([1,l]\)。用 \(p_{1\sim l-1}\) 将 \(1\sim n\) 划分成 \(l\) 段。查询 \([1,l]\) 内第 \(k\) 大,若返回值等于 \([1,l-1]\) 内第 \(k\) 大,说明 \(p_l\) 小于 \([1,l-1]\) 内第 \(k\) 大;否则大于。依旧二分,直到返回一个不在 \(p_{1\sim l-1}\) 中出现过的数就是 \(p_l\)。代价 \(\frac{\log(l)}{l-1}\)。
确定 \(p_r\) 同理。
先用区间 DP 求出最优策略,再根据路径询问即可。
P17772 道路检修
边看成无向边后和 \(s\) 不联通的边先判掉。现在剩下一个和 \(s\) 联通的图。
先考虑判定有解。
显然,每条边知会折返最多一次。不难想到维护一个新图,对于一条边 \(u\to v\):
- 若 \(b = 0\)。添加边 \(u\to v, v\to u\)。表示需要返回。
- 若 \(b=1\)。添加边 \(u\to v, u\to v, v\to u\)。表示可能折返(但其实并不需要)。
那么原问题有解,当且仅当新图存在欧拉路径。
最小化步数就相当于最小化新图边数。
因为删二元环不影响 \(u,v\) 两点度数差。所以一种删的方式合法,等价于所有 \(b = 1\) 的边可以通过 \(b =0\) 的反向边到达 \(s\)。
那么将原图 \(b=1\) 的边标记为关键边。问题变成求最少保留多少非关键边。
因为原图存在欧拉路径,所有关键边构成了若干个环(可能存在最多一条边无法构成环,且这条边一定是到终点的边)。
将一个关键边联通块缩成一个点,这样点数不超过 \(\lfloor\frac{k}{3}\rfloor+1\)。其中 \(k\) 是关键边数量。
问题变成给定一个点集 \(S\) 和一张有向图 \(G\)。求 \(G\) 中 \(S\) 的最小斯坦纳树大小。
复杂度 \(O(3^{\lfloor\frac{k}{3}\rfloor+1}n+2^{\lfloor\frac{k}{3}\rfloor+1}(n+m)\log m)\)。
P10855 【MX-X2-T4】「Cfz Round 4」Gcd with Xor
把 \(1\sim n\) 插到 Trie 里。
枚举 \(j\),那么 \((x\oplus j)\le n\) 的 \(x\) 可以表示成 Trie 上 \(O(\log n)\) 个节点的子树,\((x\oplus j)<j\) 同理。那么对每个 \(j\) 可以得到 \(O(\log n)\) 个形如 \((j,l,r,v)\) 的贡献对,表示对 \(d\mid j\) 的 \(g(d)\) 产生 \(v\cdot \sum\limits_{i=l}^{r}[d\mid i]\) 的贡献。枚举 \(j\) 的约数 \(d\),贡献直接就是 \(v\cdot (\lfloor\frac{r}{d}\rfloor-\lfloor\frac{l-1}{d}\rfloor)\)。注意 \(x=0\) 的情况。
这部分时间复杂度 \(O(n\log^2 n)\)。
对于原问题,想要维护 \(f(d) = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{i}[\gcd(j,j\oplus i)=d]\)。有:
最后答案就是 \(\sum\limits_{x=1}^{n}x^kf(k)\)。整体时间复杂度 \(O(n\log^2 n)\)。
P17821 回層浮 / kaisou
口胡的,可能细节上有点问题。
定义状态函数 \(f_i\) 表示最后一个选择的数是 \(i\) 时最大贡献和。
有:\(f_i = \max(0,\max\limits_{j\le i}^{}(f_j + \sum\limits_{u=1}^{m}|(x_i - x_j)-t_u|))-c_i\)。
对于每个 \(i\),维护函数 \(F_i(x) = f_i + \sum\limits_{u=1}^{m}|x - t_u|\)。显然 \(F_i(x)\) 是一个凸函数。
设 \(F(x) = \sum\limits_{u=1}^{m}|x-t_u|\)。
将 \(t_u\) 升序排序。计算 \(F_i(x)\) 时可以直接二分找到第一个满足 \(x < t_v\) 的 \(v\),那么可以写成:
其中 \(s\) 为 \(t\) 的前缀和。单次查询时间 \(O(\log m)\)。
转移变成:\(f_i = \max(0,\max\limits_{j\le i}^{}F_j(x_i-x_j)) - c_i\)。
显然,两个凸函数最多只有一个交点。那么就可以把 \(F_i\) 放李超线段树上做了。
具体的,设李超线段树上当前节点存的最优函数为 \(F_a\),尝试更新的函数为 \(F_b\),且 \(F_a(mid)\ge F_b(mid)\)。
不妨设 \(x_a < x_b\),记 \(x' = x - x_b,\Delta = x_b-x_a\),那么:
因为 \(F(x + \Delta) -F(x)\) 在 \(\Delta\) 一定时随着 \(x\) 增加单调不降,所以若 \(F_a(mid)\ge F_b(mid)\),则对任意 \(x>mid\) 均有 \(F_a(x)\ge F_b(x)\)。此时只可能在 \(x<mid\) 处更新。
\(x_a > x_b\) 的情况同理,\(x_a = x_b\) 显然不可能更新。
时间复杂度 \(O(n\log n\log m)\)。
这里 \(|t_j|\le 10^7\),值域分下块可以把 \(\log m\) 变小。若阈值为 \(B\) 则二分复杂度为 \(O(\log B)\),空间为 \(O(\frac{V}{B}),V = 2\times 10^7\)。
2026.11.6
P11746 Dynamic Color Problem
首先 \(n+m\) 是偶数答案一定是 \(0\)。
容斥。记 \(g(x,y)\) 为钦定 \(x\) 行 \(y\) 列颜色完全相同的方案数,\(f(x,y)\) 为恰好。
那么 \(g(x,y) = \sum\limits_{X\ge x}^{}\sum\limits_{Y\ge y}^{}\binom{X}{x}\binom{Y}{y}f(X,Y)\)。
有 \(f(x,y) = \sum\limits_{X\ge x}^{}\sum\limits_{Y\ge y}^{}(-1)^{X-x+Y-y}\binom{X}{x}\binom{Y}{y}g(X,Y)\)。
显然,\(g(x,y)\) 是可以直接算出来的,有:
- \(x =0,y = 0\)。\(g(x,y)=2^{nm}\)。
- \(x=0,y\ne 0\)。\(g(x,y) = \binom{m}{y}2^{y + n(m-y)}\)。
- \(x\ne 0,y=0\)。\(g(x,y) = \binom{n}{x}2^{x + m(n-x)}\)。
- \(x\ne 0, y\ne 0\)。\(g(x,y) = \binom{n}{x}\binom{m}{y}2^{(n-x)(m-y)+1}\)。
答案为:
那么对 \(X,Y\) 的四种情况分类讨论。
\(X=0,Y=0\)。原式等于:
\(X=0,Y\ne 0\) 或 $X \ne 0,Y =0 $。以前者举例,原式等于:
\(X \ne 0,Y\ne 0\)。原式等于:
整体时间复杂度 \(O(Tn\log n)\)。
CF2029G Balanced Problem
考虑给定下标 \(i_{1\sim k}\) 和 \(v\),判定能否操作使得 \(a'_{i_{1\sim k}} = v\)。
显然,有解时一定存在一组方案使得每次操作选择的 \(x\) 都是 \(i_{1\sim k}\) 中某一个。
对 \(a_{i_{1\sim k}}\) 做差分,得到 \(b_{1\sim k}\)。
操作 \(1\) 相当于 \(b_{i}\) 增加 \(1\),\(b_{i+1}\) 减少 \(1\);操作 \(2\) 相当于 \(b_i\) 增加 \(1\)。
贪心地,先将所有 \(b_{2\sim k}\) 增加到非负,再将 \(b_{2\sim k}\) 多的值移到 \(b_1\),最后将 \(b_1\) 增加到 \(v\)。
那么判定条件为:\(\sum\limits_{i=2}^{k}\max(0,b_i)+b_1 \le v\)。也就是 \(\sum\limits_{j=1}^{k}\max(0,a_{i_j}-a_{i_{j-1}})\le v\)。
首先 \(a_i > V\) 的点一定不会产生贡献。因为 \(V\ge v\ge \sum\limits_{j=1}^{k}\max(0,a_{i_j}-a_{i_{j-1}})\ge \max\limits_{j=1}^{k}a_{i_j}\)。
再将 \(a_i = a_{i+1}\) 的点合并起来。这样相邻两个点就都不一样了,有 \(|a_i - a_{i+1}|\ge 1\)。
因为 \(a\) 序列也是由操作得到的,有 \(\sum\limits_{i=1}^{n}|a_i-a_{i-1}|\le a_{1}+a_n\)。
那么现在得到的序列长度不超过 \(4V\),值域为 \([0,V]\)。
定义状态函数 \(f_{u,s}\) 表示当前 \(\sum \max(0,a_{i_j}-a_{i_{j-1}})=s\),且 \(i_k=u\) 时最大贡献和。
对于 \(f_{i,s}\),有:
- \(a_j \ge a_i\)。\(f_{i,s}\gets f_{j,s}+c_i\)。枚举 \(s\),维护 \(O(V)\) 棵树状数组。相当于在第 \(s\) 棵树状数组中查询 \(a_j \ge a_i\) 的 \(f_{j,s}\) 最大值。
- \(a_j < a_i\)。\(f_{i,s}\gets f_{j,(s-a_i)+a_j}+c_i\)。枚举 \(s\),同样维护 \(O(V)\) 棵树状数组。相当于在第 \(s-a_i\) 棵树状数组中查询 \(a_j < a_i\) 的 \(f_{j,a_j + (s-a_i)}\) 最大值。
时间复杂度 \(O(V^2\log V)\)。
CF2026F Bermart Ice Cream
把操作树建出来。树上点分成两类:
- 店铺。
- 查询、删除、复制操作或新增冰淇淋。
初始只有店铺 \(1\)。对于 \(4\) 种操作:
- 将店铺 \(x\) 变成复制操作,然后给它挂两个儿子。一个还是店铺 \(x\),另一个是新的店铺。
- 将店铺 \(x\) 变成冰淇淋,然后给他挂一个儿子。表示店铺 \(x\)。
- 和操作 \(2\) 一样。
- 和操作 \(2\) 一样。
问题变成从根开始 DFS,求走到每个询问点时的背包。
首先背包的撤销(DFS 回溯)是简单的,维护修改量即可。
对于删除最前面一个元素,可以用双栈维护队列的方式做。每次用于弹出的栈空了就把用于插入的栈中一半元素放过去,重新维护背包。
时间复杂度 \(O(pq)\),空间复杂度 \(O(pq)\)。
P11993 [JOIST 2025] 迁移计划 / Migration Plan
对每个深度开一棵线段树,维护 dfn 序上每个点实际贡献了多少海狸。
迁移线段树合并,迁入单点加,调查区间和。
时间复杂度 \(O(n\log n)\)。
QOJ5358 宝石游戏
操作分块,设阈值为 \(B\)。
长剖,维护每个深度的宝石数量。每
次重构相当于 \(O(n)\) 次单点修改,共 \(O(\frac{nm}{B})\) 次单点修改。
共 \(O(m)\) 次区间查询,每次查询在额外枚举这 \(O(B)\) 个被修改的点。因为每个深度宝石数量已经知道了,所以可以 \(O(1)\) 查询。
用 \(O(1)-O(\sqrt{n})\) 的分块维护区间异或和可以做到 \(O(\frac{nm}{B}+m\sqrt{n}+mB)\)。取 \(B=\sqrt{n}\) 就是 \(O(n\sqrt{n})\) 的。
P14164 [ICPC 2022 Nanjing R] 命题作文
可惜这波贪了,原树竟然是条链。
考虑对 \(e,f\) 分类讨论。
把边分成 \(4\) 类:
- 非树边。
- 被 \(0\) 条非树边覆盖的树上边。
- 被 \(1\) 条非树边覆盖的树上边。
- 被至少 \(2\) 条非树边覆盖的树上边。
可能的合法情况有:
- \(e,f\) 中恰好有一条第 \(2\) 类边。设第 \(2\) 类边有 \(x\) 条,当前共 \(y\) 条边。方案数为 \(x(y-x)\)。
- \(e,f\) 中有一条是第 \(3\) 类边,且另一条恰好是覆盖他的非树边。设第 \(3\) 类边有 \(z\) 条。方案数为 \(z\)。
- \(e,f\) 都是树上边,且被相同的非树边覆盖。设这样的边有 \(w\) 条。方案数为 \(\binom{w}{2}\)。
情况 \(1,2\) 都是简单的,直接用 set 维护即可。相当于不断删除在区间 \([u,v]\) 中的边(这里 \(u<v\),表示新加进来的非树边)。
对于情况 \(3\),用平衡树维护等价类集合。对于受到影响的等价类集合,直接 split 就可以分裂出新的等价类集合。对于分裂出来的两棵平衡树,暴力遍历大小较小的那个,把里面每个点的颜色换成另一种。维护每个点和它同颜色的前驱后继。这样区间内 \(pre < l\) 或 \(nxt>r\) 的点对应颜色就一定受到影响了。遍历较小的保证了复杂度,等价于启发式分裂。
整体时间复杂度 \(O(n\log n)\)。
2026.11.9
P15111 群星
设当前排名为 \(x\),观察发生一场战争后排名的期望。
分情况讨论:
- \(x\) 没被选。排名不变。概率为 \(\frac{\binom{n-1}{2}}{\binom{n}{2}}\)。
- \(x\) 被选。排名改变。若另一个选择的是排名为 \(y\) 的人,交换后排名变成 \(y\)。概率为 \(\frac{1}{\binom{n}{2}}\)。
期望为:
当 \(n \ge 3\) 时上面这个期望值随 \(x\) 增加单调不减。先不考虑 \(n < 3\) 的情况。
记 \(g(x,y) = (1-\frac{2}{n-1})\cdot g(x,y-1) + (1+\frac{2}{n-1})\)。
那么策略应该是在选择的时候直接选能选的中排名最小的那个。如果在世纪 \(i\) 能选择的最小排名为 \(x\),那么答案就是 \(g(x,\sum\limits_{j\ge i}^{}a_j)\)。
记 \(f(x,c)\) 表示排名为 \(1\sim i\) 的文明中被选择的文明数量为 \(c\) 的概率。那么能选择的最小排名为 \(x\) 的概率就是 \(f(x-1,x-1)-f(x,x)\)。
定义状态函数 \(f_{i}(x,c)\) 为考虑到当前时刻,排名为 \(1\sim x\) 的文明中被选择的文明数量为 \(c\) 的概率。
世纪初,有:\(f_{i}(x,\min(c+1,x))=f_{i-1}(x,c)\)。
对于 \(f_i(x,c)\),可知排名 \([1,x]\) 中有 \(c\) 个,\([x+1,n]\) 中有 \(i-c\) 个。观察发生一场战争后的局面,分类讨论:
- 交换的文明对都不是被选择的文明。新状态为 \((x,c)\)。概率 \(\frac{\binom{n-i}{2}}{\binom{n}{2}}\)。
- 交换的文明对恰有一个是被选择的文明。
- 被选择的文明在 \([1,x]\),没被选择的文明在 \([1,x]\)。新状态为 \((x,c)\)。概率 \(\frac{c\cdot (x-c)}{ \binom{n}{2}}\)。
- 被选择的文明在 \([1,x]\),没被选择的文明在 \([x+1,n]\)。新状态 \((x,c-1)\)。概率 \(\frac{c\cdot (n-x-(i-c))}{\binom{n}{2}}\)。
- 被选择的文明在 \([x+1,n]\),没被选择的文明在 \([1,x]\)。新状态 \((x,c+1)\)。概率 \(\frac{(x-c)\cdot (i-c)}{\binom{n}{2}}\)。
- 被选择的文明在 \([x+1,n]\),没被选择的文明在 \([x+1,n]\)。新状态 \((x,c)\)。概率 \(\frac{(i-c)\cdot (n-x-(i-c))}{\binom{n}{2}}\)。
- 交换的文明对都是被选择的文明。
- 都在 \([1,x]\)。新状态 \((x,c)\)。概率 \(\frac{\binom{c}{2}}{\binom{n}{2}}\)。
- 都在 \([x+1,n]\)。新状态 \((x,c)\)。概率 \(\frac{\binom{i-c}{2}}{\binom{n}{2}}\)。
- 一个在 \([1,x]\),一个在 \([x+1,n]\)。新状态 \((x,c)\)。概率 \(\frac{c\cdot (i-c)}{\binom{n}{2}}\)。
整理一下,记转移前状态函数为 \(f'_i(x,c)\),转移后为 \(f_{i}(x,c)\)。有:
发生 \(a_i\) 场战争就是转移 \(a_i\) 次。矩阵快速幂优化做到转移 \(O(n^4\log a_i)\)。
整体复杂度 \(O(kn^4\log \max(a_i)+kn\log(\sum a_i))\)。
不是,数据里怎么没有 \(n< 3\) 的情况啊。
\(n = 1\) 的时候显然输出 \(1\)。
\(n = 2\) 的时候发生一场战争就一定会交换排名。对于 \(i=1\) 答案一定是 \(1\);对于 \(i=2\) 在 \(a_1\equiv a_2 \pmod 2\) 时为 \(2\),否则为 \(1\)。
P15180 [SWERC 2021] Antennas
记 \(L_i\) 为 \(i\) 左边最后一个满足 \(p_j \ge p_i\) 的位置 \(j\);\(R_i\) 为 \(i\) 右边最后一个满足 \(p_j \ge p_i\) 的位置 \(j\)。
对 \(j\in [L_i,R_i]\),条件可以写成 \(|i-j|\le p_i\)。那么 \(j\) 的范围就是 \([\max(i-p_i,L_i),\min(i+p_i,R_i)]\)。
相当于 \(i\) 向一个区间内所有点连一条 \(1\) 的双向边。线段树优化建图即可。
然后跑 01BFS 就可以了。
时间复杂度 \(O(n\log n)\)。
P15143 [SWERC 2025] Isaac's Queries
对于 \(f(l,r)\),若存在 $1 \le x < l $,使得 \(f(x,l-1)\ne f(x,r)\)。则 \(f(l,r) = \max(f(x,l-1),f(x,r))\)。
因为数据是随的,所以枚举 \(x\),能推就推,不能推就问。
复杂度 \(O(n^3)\)。
P15324 【MX-X24-T5】「RiOI-7」ANDORXOR
先考虑判定一个 \(01\) 序列能否让先手必胜。
对 \(x,y\) 分类讨论:
- \(x=0,y=0\)。操作只能得到 \(0\)。
- \(x=0,y=1\)。操作能得到 \(0,1\)。
- \(x=1,y=0\)。操作能得到 \(0,1\)。
- \(x=1,y=1\)。操作能得到 \(0,1\)。
首先序列长度为奇数先手必败,因为最后一步后手一定可以让序列剩下 \(0\)。
整理一下可能的操作,相当于以下两种操作之一:
- 删去一个数。
- 将相邻两个 \(11\) 合并成一个 \(0\)。
后手想要 \(1\) 尽可能少,先手想要 \(1\) 尽可能多。
那么先手的策略只能是删去一个 \(0\)(全是 \(1\) 的时候删 \(1\));后手的策略可以是删去一个 \(1\),也可以是删去两个连续的 \(1\) 并加入一个 \(0\)。
显然,对于连续的 \(1\),如果后手只删一个,先手是不会删另一个的(在全是 \(1\) 的情况下先手删另一个和后手先将它们变成一个 \(0\) 先手再删是一样的)。那么 \(11\dots 1\) 只能由后手先手交替删。即后手把 \(11\) 变成 \(0\),先手再删 \(0\)。
这样相邻两个 \(1\) 就可以删去了。剩下形如 \(10\dots 010\dots 010\) 的序列。
显然,此时先手能赢当且仅当 \(cnt_1 \ge cnt_0\)。
也就是说,对于一个 \(01\) 序列,先手必胜当且仅当长度为奇数的 \(1\) 连续段数量不小于 \(0\) 的数量。
对一个 \(0\),能匹配前面的 \(1\) 就尽量匹配前面的 \(1\)。那么合法 \(01\) 序列的匹配就一定是相邻两个匹配在一起(两个 \(11\) 也看成匹配)。此时满足:
- 不存在 \(00\)。
- 所有 \(10\) 都在 \(01\) 前面。
\(f_i(0/1)\) 表示考虑完前 \(i\) 个位置,是否出现过 \(01\),且没出现过 \(00\) 的方案数。记 \(g_i(a,b)\) 表示 \(s_{i-1}=a,s_i=b\) 的方案数。有:
区间询问写成矩阵放线段树上面就行了。时间复杂度 \(O(\omega^3 n\log n),\omega = 2\)。
P15253 [NOSOI R1] Raining Mex
刻画两点间路径可以用圆方树。
对于一个圆点 \(u\),定义其权值下标集合为 \(\{u\}\);对于一个方点 \(u\),定义其权值下标集合为这个点双中所有点下标构成集合。记集合为 \(s_u\)。
那么 \(x\) 到 \(y\) 所有可能路径的最大路径权值,就是不可重集 \(S_0 = \bigcup\limits_{u\in P(x,y)}^{}s_u\) 时,可重集 \(S = \{w_i | i\in S_0\}\) 的权值。
先考虑给定集合 \(S\) 怎么求权值。
从小到大枚举 \(S\) 中的元素 \(v_{1\sim k}\)。设当前能凑出来的值为 \([0,x]\)。对 \(v_i\) 分情况讨论:
- \(v_i \le x + 1\)。则 \(x' = x + v_i\)。
- \(v_i > x+1\)。一定凑不出 \(x+1\)。此时 \(S\) 的权值就是 \(x+1\)。
记 \([0,x+1]\) 中元素的和为 \(y\)。那么 \([0,y]\) 是一定能凑出来的。
如果 \(y\ge x+1\),设 \([0,x]\) 这个值域是由值在 \([0,z]\) 中的数凑出来的,那么 \([z+1,x+1]\) 中一定至少有一个在 \(S\) 中的数。此时 \(z' = x+1,x' = y \ge x + z+1 >2z\)。那么只会计算 \(O(\log V)\) 次。
问题变成求树上两点间权值不大于 \(x\) 的权值和。主席树维护即可。
时间复杂度 \(O(n\log n\log V)\)。
AT_agc027_e [AGC027E] ABBreviate
考虑寻找不变量。
把 \(a\) 看成 \(1\),\(b\) 看成 \(2\)。那么在模 \(3\) 意义下合并两个连续的数就相当于把它们加起来。
如果给定操作后的字符串 \(t\)。\(s\) 能够操作得到 \(t\),一个必要条件是 \(s\) 能拆成 \(|t|\) 个连续段,使得每个连续段加起来恰好等于 \(t\) 这一位的值。
打表可以发现充分条件是 \(s\) 可以进行至少一次操作。即 \(s\) 不等于 \(ababa\dots\) 或 \(babab\dots\)。
为了不重不漏,贪心匹配 \(t\) 即可。定义状态函数 \(f_i\) 表示当前匹配到了 \(s_i\) 的方案数。记 \(sum_i\) 为前缀和,\(nxt_i(x)\) 为 \(i\) 后面第一个满足 \(sum_j = x\) 的 \(j\)。转移为:
- \(f_{nxt_{i+1}(sum_i-1)}\gets f_i , f_{nxt_{i+1}(sum_i-2)}\gets f_i\)。
答案为 \(\sum\limits_{}^{}f_i[sum_i= sum_n]\)。
时间复杂度 \(O(n)\)。
P13688 【MX-X16-T6】「DLESS-3」XOR and Powerless Suffix Mode
记 \(c(x)\) 为 \(x\) 的出现次数。枚举众数为 \(x\),方案数为 \(f(x)=\sum\limits_{i=1}^{\frac{p}{100}\cdot c(x)}\prod\limits_{y\ne x}^{}(\sum\limits_{j=0}^{i}\binom{c(y)}{j})\)。答案就是 \(\bigoplus\limits_{f(x)\bmod 2 = 1}^{}x\)。
那么:
一个区间只有 \(O(\sqrt{n})\) 中出现次数,把它们找出来之后维护前后缀与即可。
考虑根号分治。
维护 \(s(x),cnt(x)\) 表示出现次数不小于 \(x\) 的数的异或和及其数量。那么出现次数等于 \(x\) 的数的异或和就是 \(s(x)\oplus s(x+1)\),数量为 \(cnt(x) - cnt(x+1)\)。对于 \(x\le \sqrt{n}\) 就这么维护。
对于 \(x>\sqrt{n}\),显然这样的数的数量也不超过 \(\sqrt{n}\)。暴力存具体是哪些数即可。
用回滚莫队跑。时间复杂度 \(O(n\sqrt{n})\)。
注意 \((\text{AND}_{y\ne x}^{} (c(y)-1) = 0\) 的情况。
2026.11.10
P13714 淘汰(Hard ver.)
倒着做。
对最后一次运算分类讨论:
- $x'= x \text{ AND } a $。对于二进制下第 \(i\) 位:
- \(x'_i = 1, a_i = 1\)。此时 \(x_i =1\)。
- \(x'_i= 0,a_i =1\)。此时 \(x_i = 0\)。
- \(x'_i = 0, a_i = 0\)。此时 \(x_i = ?\)。
- \(x' = x \text{ OR } a\)。对于二进制下第 \(i\) 位:
- \(x'_i = 0, a_i = 0\)。此时 \(x_i = 0\)。
- \(x'_i = 1,a_i = 0\)。此时 \(x_i = 1\)。
- \(x'_i = 1, a_i = 1\)。此时 \(x_i = ?\)。
从倒数第二次运算开始,\(x'_i = ?\) 的情况显然能推出 \(x_i = ?\)。
不难发现,任意时刻 \(x_i\) 要么是 \(?\),要么是 \(y_i\)。
那么定义状态函数 \(f_{S}\) 表示对于二进制下第 \(i\) 位,若 \(i\in S\) 则 \(x_i = y_i\);若 \(i\notin S\) 则 \(x_i = ?\) 时从 \(y\) 变成 \(x\) 的最小代价。
一个 \(S\) 是终状态当且仅当此时表示的 \(x'\) 和原题给定的 \(x\) 匹配。
考虑转移,不妨设状态 \(S\) 转移到 \(S'\)。有 \(S' \subset S\)。分情况讨论:
- \(i\in (S \setminus S')\) 均满足 \(y_i = 0\)。此时是一个 \(\text{AND}\) 操作。要求对 \(i\in (S\setminus S')\) 有 \(a_i = 0\),对 \(i\in S'\) 有 \(a_i = 1\)。因为 \(i\in S'\) 时 \(a_i = 1\) 一定不优,记 \(T = \{i | i\in S'\land y_i = 1\}\cup (S\setminus S')\),相当于只要求选出来的 \(a\) 满足对任意 \(i\in T\),均有 \(a_i = y_i\)。设 \(g_T\) 为满足条件的 \(a\) 中,对应 \(c\) 的最小值。转移为 \(f_{S'}\gets f_S + g_T\)。
- \(i\in (S\setminus S')\) 均满足 \(y_i = 1\)。此时是一个 \(\text{OR}\) 操作。要求对 \(i\in (S\setminus S')\) 有 \(b_i = 1\),对 \(i\in S'\) 有 \(b_i = 0\)。同样的,设 \(h_T\) 为满足条件的 \(b\) 中,对应 \(d\) 的最小值。转移为 \(f_{S'}\gets f_S + h_T\)。
对于 \(g_T,h_T\)。枚举 \(T\),再枚举所有 \(i\notin T\),\(a_i\) 或 \(b_i\) 的值。这样 \(a\) 或 \(b\) 就唯一确定了。
整体时间复杂度 \(O(3^k + k2^k + n)\)。
P15731 [JAG 2024 Summer Camp #2] Convenient Banknotes
不妨设 \(k = 3\)。记 \(X_2 = a,X_3 = a\cdot b\)。考虑计算 \(A\) 日元所需最小纸币张数。
显然就是 \(\lfloor\frac{A}{a\cdot b}\rfloor + \lfloor\frac{A\bmod (a\cdot b)}{a}\rfloor + A\bmod a\)。设 \(A = C\cdot a\cdot b + B\)。那么原式等于:
拓展到 \(k \ne 3\)。记 \(D_i = \frac{X_{i+1}}{X_{i}}\)。
设 \(S\) 为 \(A\) 日元所需最小纸币张数,那么 \(S\) 可以这么算出来:
-
枚举 \(i = 1\dots k-1\)。将 \(S\) 增加 \(A\bmod D_{i}\),并将 \(A\) 变成 \(\lfloor\frac{A}{D_i}\rfloor\)。
-
在枚举完 \(i\) 后,将 \(S\) 增加 \(A\)。
考虑 DP。
定义状态函数 \(f(A,B,C)\) 为如果要表示出 \(A,B,C\),所需的最小代价。枚举 \(D \ge 2\),分情况讨论:
- 是情况 \(1\)。代价 \((A\bmod D) + (B\bmod D)+(C\bmod D) + f(\lfloor\frac{A}{D}\rfloor,\lfloor\frac{B}{D}\rfloor,\lfloor\frac{C}{D}\rfloor)\)。
- 是情况 \(2\)。代价 \(A+B+C\)。
对于情况 \(1\) 用整除分块枚举即可。
时间复杂度 \(O(V^{\frac{3}{4}})\)。
P17083 [COTS 2026] 排列 / Permutacije
如果 \((l,r,L,R)\) 合法。则对 \(i\in [l,r]\),\(a_i\) 在 \(b\) 中的出现位置 \(pos_b(i)\) 满足 \(pos_b(i) < L\lor pos_b(i)>R\)。
维护前缀 \(pos_a(i)\) 的最小最大值,后缀 \(pos_a(i)\) 的最小最大值。设它们分别是 \(a,b,c,d\)。
那么 \((L,R)\) 合法,当且仅当 \(\max(b_{L-1},d_{R+1})-\min(a_{L-1},c_{R+1})=n-(R-L+1)\)。
从小到大枚举 \(L-1\)。双指针维护 \(i,j\) 表示:
- 对 \(R+1 \ge \max(i,j)\)。有 \(b_{L-1}>d_{R+1},a_{L-1}<c_{R+1}\)。
- 对 \(\max(i,j) > R+1\ge \min(i,j)\)。有 \(b_{L-1}<d_{R+1},a_{L-1}<c_{R+1}\) 或 \(b_{L-1}>d_{R+1},a_{L-1}>c_{R+1}\)。
- 对 \(\min(i,j)>R+1 > L-1\)。有 \(b_{L-1}<d_{R+1},a_{L-1}>c_{R+1}\)。
这三种情况都差不多。以情况 \(2\) 中 \(b_{L-1}<d_{R+1},a_{L-1}<c_{R+1}\) 举例。
式子化简成 \(d_{R+1}-(n-R) =c_{L-1} + (L-1)\)。拿个桶算数量即可。
整体时间复杂度 \(O(n)\)。

浙公网安备 33010602011771号