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\) 为纵坐标。贡献可以看作是一个平行四边形。

考虑把平行四边形补成矩形,再除去两个三角形的贡献。也就是:

  1. 对以 \((L_u,1)\) 为左下角,\((u,R_u-L_u+1)\) 为右上角的矩形中每个点增加 \(a_u\) 的贡献。
  2. 对由 \((L_u,1),(L_u,u-L_u),(u-1,1)\) 构成的直角三角形中每个点减少 \(a_u\) 的贡献(可能不存在)。
  3. 对由 \((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)\) 都有一个存在时间)。后者直接树状数组,前者讨论大小:

  1. \(y \ge p+k\)。贡献为 \(p\)。
  2. \(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\) 的情况一定在不断删两个数的过程中变成这两个之一。

  1. \(n = 2|\sum|\)。
    1. 所有数均出现 \(2\) 次。那么后手跟着先手删,一定可以达到 \(n = 2|\sum| =2\) 的局面。此时 Us 赢。
    2. 存在一个数出现至少 \(3\) 次。如果先手删出现 \(2\) 次的,后手就跟着删;如果先手删出现 \(1\) 次的,后手就删出现至少 \(3\) 次的;如果先手删出现至少 \(3\) 次的,后手就删出现 \(1\) 次的。这样一轮之后依旧满足 \(n = 2|\sum|\)。此时 Us 赢。
  2. \(n = 2|\sum|+1\)。
    1. 存在数出现 \(1\) 次。先手或后手一定会有一个删它。之后仍然满足 \(n = 2|\sum|+1\)。
    2. 所有数出现至少 \(2\) 次。此时一定存在一个数出现奇数次。出现奇数次的数数量要么不变,要么减少 \(1\),最后在 \(n=3\) 时一定出现两个相同的数相邻。此时 Us 赢。

对于 \(n \le 19\) 的情况,状压即可。时间复杂度 \(O(Tn2^n)\)。

P9393 紫丁香

拆位,看每一位能不能是 \(1\)。

相当于给定集合 \(S\),问能否在若干次操作后使得 \(S\) 内所有二进制为均为 \(1\)。

倒着推。把 \(S\) 外的二进制位看成 \(?\),即通配符。

考虑一个状态 \(t\) 可以被哪些状态 \(s\) 通过 \(T\) 推出来。分情况讨论:

  1. \(T_i = 0\)。此时要求 \(t_i \ne 1\)。\(s_i = ?\)。
  2. \(T_i = 1\)。此时要求 \(t_i \ne 0\)。\(s_i = ?\)。
  3. \(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)\) 后到达的点。有:

  1. \(nxt(u,i,0) = nxt(nxt(u,i-1,0),i-1,1)\)。
  2. \(nxt(u,i,1) = nxt(nxt(u,i-1,1),i-1,0)\)。

初始状态:

  1. \(nxt(u,0,0) = out(u,0)\)。
  2. \(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)\)。

考虑标记下传。有:

  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)\)。
  2. \(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\) 为前缀和。那么要求形如:

  1. \(s_{-\infin} \ge 0\)。
  2. \(s_i \ge s_{i-1}\)。
  3. \(1\le s_{r_i} - s_{l_i-1}\le x\)。

差分约束连边:

  1. \((i-1)\to i\),边权为 \(0\)。
  2. \(r_i\to (l_i-1)\),边权为 \(-x\)。
  3. \((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]\) 的方案数。转移为:

  1. \(g_i(x,y)\gets g_{i-1}(x,y)\)。
  2. 若 \(x_i=0,x_{i-1}=0\)。\(g_i(x+1,y)\gets g_{i-2}(x,y)\times (A - x)\)。
  3. 若 \(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」子序列

对于一个字符串的不同子串数量,转移为:

\[\begin{aligned}\\ f_{i,s_i} &= f_{i-1,0}+f_{i-1,1}+1\\ f_{i,s_i \oplus 1} &= f_{i-1,s_i\oplus 1} \end{aligned} \]

只要 \((f_{|s|,0}+f_{|s|,1})\bmod 2=0\) 就说明这个子串 \(s\) 是好的。

将 \(f_{i,j}\) 对 \(2\) 取模,有:

\[\begin{aligned}\\ f_{i,s_i} = f_{i-1,0}\oplus f_{i-1,1}\oplus 1\\ f_{i,s_i\oplus 1} = f_{i-1,s_i\oplus 1}\\ \end{aligned} \]

那么就可以用两个 \(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\) 分情况讨论:

  1. \(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\) 加入(如果不在集合中)或删除(如果在集合中)后得到的集合。
  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\) 后得到的状态。那么转移方程可以写成:

\[\begin{aligned}\\ g_{i,\text{Nxt}(x,0)}\gets g_{i-1,x}[s_i \ne 1]\\ g_{i,\text{Nxt}(x,1)}\gets g_{i-1,x}[s_i\ne 0] \end{aligned} \]

初始化 \(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

深刻,搓了十分钟调两个小时。

先考虑状态函数怎么定义,具体要维护什么。

模拟整个过程,任意时刻队列中元素分成两类:

  1. 之后不会弹出的元素。
  2. 之后会弹出的元素。

对于一个第一类元素,不妨设加入它时已经弹出的 \(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\) 的数量。有以下等式关系:

  1. \(s+X+Y+Z+W=d_i\)。
  2. \(Z =m-j\)。
  3. \(X + W =k\)。
  4. \(Z+W = c_i\)。

由此可以解出 \(X,Y,Z,W\)。

那么转移就是简单的了。时间复杂度 \(O(n^3)\)。

P14231 复读机 / repeat

设答案为 \(x\)。

把数分成两类:

  1. \(2a_i \le x\)。记为 \(A\) 类。
  2. \(2a_i > x\)。记为 \(B\) 类。

那么合法子序列一定形如:\(A\dots, A ,B,A,\dots, A,B,A,\dots ,A,\dots\)。

最大长度也就是 \(A\) 类点数量加上可插入 \(B\) 类点数量。

从小到大枚举 \(x\),考虑每个点的贡献。

  1. 对于 \(i\),当 \(x\in [2a_i,+\infin)\) 时会产生 \(1\) 的贡献。即对 \(l\in [1,i],r\in [i,n],x\in [2a_i,+\infin)\) 产生 \(1\) 的贡献。
  2. 对于某时刻相邻两个 \(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\) 的范围。

那么此时有两种方式:

  1. 查询 \([l+1,n]\)。因为 \(p_{1\sim l-1},p_{r+1,n}\) 一定确定了,所以 \(p_l\) 的可能值也是已知的。二分答案,代价 \(\frac{\log(r-l+1)}{n-l}\)。
  2. 查询 \([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\):

  1. 若 \(b = 0\)。添加边 \(u\to v, v\to u\)。表示需要返回。
  2. 若 \(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

\[\begin{aligned}\\ g(d) &= \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{i}[d\mid \gcd(j,j\oplus i)]\\ &=\sum\limits_{d\mid j}^{}\sum\limits_{i=j}^{n}[d\mid (j\oplus i)]\\ &=\sum\limits_{d\mid j}^{}\sum\limits_{d\mid x}^{}[j \le(x\oplus j)\le n]\\ &=\sum\limits_{d\mid j}^{}\sum\limits_{d\mid x}( [(x\oplus j) \le n] - [(x\oplus j) < j])\\ \end{aligned} \]

把 \(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]\)。有:

\[\begin{aligned}\\ g(d) &=\sum\limits_{d\mid x}^{}f(x)\\ f(x) &= \sum\limits_{x\mid d}^{}\mu(\frac{d}{x})g(d) \end{aligned} \]

最后答案就是 \(\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\),那么可以写成:

\[\begin{aligned}\\ F_i(x) &= \sum\limits_{u=1}^{v-1}(x-t_u) + \sum\limits_{u=v}^{m}(t_u-x)\\ &=((v-1) - (m-v+1))x+s_m - 2s_{v-1} \end{aligned} \]

其中 \(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\),那么:

\[\begin{aligned}\\ F_a(x) - F_b(x)&=f_a - f_b + F(x-x_a) - F(x -x_b)\\ &=(f_a-f_b) + (F((x-x_b) + (x_b - x_a)) - F(x-x_b))\\ &=(f_a-f_b)+(F(x' + \Delta) - F(x')) \end{aligned} \]

因为 \(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)\) 是可以直接算出来的,有:

  1. \(x =0,y = 0\)。\(g(x,y)=2^{nm}\)。
  2. \(x=0,y\ne 0\)。\(g(x,y) = \binom{m}{y}2^{y + n(m-y)}\)。
  3. \(x\ne 0,y=0\)。\(g(x,y) = \binom{n}{x}2^{x + m(n-x)}\)。
  4. \(x\ne 0, y\ne 0\)。\(g(x,y) = \binom{n}{x}\binom{m}{y}2^{(n-x)(m-y)+1}\)。

答案为:

\[\begin{aligned}\\ &\sum\limits_{x}^{}\sum\limits_{y}^{}[2\mid (x+y)]f(x,y)\\ &=\sum\limits_{x}^{}\sum\limits_{y}^{}[2\mid (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)\\ &=\sum\limits_{X}^{}\sum\limits_{Y}^{}(-1)^{X+Y}g(X,Y)\sum\limits_{x\le X}^{}\sum\limits_{y\le Y}^{}[2\mid (x+y)](-1)^{-x-y}\binom{X}{x}\binom{Y}{y}\\ \end{aligned} \]

那么对 \(X,Y\) 的四种情况分类讨论。


\(X=0,Y=0\)。原式等于:

\[\begin{aligned}\\ (-1)^{0+0}2^{nm}[2\mid (0 + 0)](-1)^{-0-0}\binom{0}{0}\binom{0}{0} \end{aligned} \]


\(X=0,Y\ne 0\) 或 $X \ne 0,Y =0 $。以前者举例,原式等于:

\[\begin{aligned} &\sum\limits_{Y\ge 1}^{}(-1)^Y\binom{m}{Y}2^{Y + n(m-Y)}\sum\limits_{y\le Y}^{}[2\mid y](-1)^{-y}\binom{Y}{y}\\ &=\sum\limits_{Y\ge 1}^{}(-1)^Y\binom{m}{Y}2^{Y + n(m-Y)}\sum\limits_{y\le Y}^{}[2\mid y]\binom{Y}{y}\\ &=\sum\limits_{Y\ge 1}^{}(-1)^Y\binom{m}{Y}2^{Y + n(m-Y)}\frac{(1+1)^Y + (1-1)^Y}{2}\\ &=\sum\limits_{Y\ge 1}^{}(-1)^Y\binom{m}{Y}2^{Y + n(m-Y)}2^{Y-1}\\ \end{aligned} \]


\(X \ne 0,Y\ne 0\)。原式等于:

\[\begin{aligned}\\ &\sum\limits_{X\ge 1}^{}\sum\limits_{Y\ge 1}^{}(-1)^{X+Y}\binom{n}{X}\binom{m}{Y}2^{(n-X)(m-Y)+1}\sum\limits_{x\le X}^{}\sum\limits_{y\le Y}^{}[2\mid (x+y)]\binom{X}{x}\binom{Y}{y}\\ &=\sum\limits_{X\ge 1}^{}\sum\limits_{Y\ge 1}^{}(-1)^{X+Y}\binom{n}{X}\binom{m}{Y}2^{(n-X)(m-Y)+1}(\sum\limits_{x\le X}^{}\sum\limits_{y\le Y}^{}[2 \mid x \land 2\mid y]\binom{X}{x}\binom{Y}{y} + \sum\limits_{x\le X}^{}\sum\limits_{y\le Y}^{}[2 \nmid x \land 2 \nmid y]\binom{X}{x}\binom{Y}{y})\\ &=\sum\limits_{X\ge 1}^{}\sum\limits_{Y\ge 1}^{}(-1)^{X+Y}\binom{n}{X}\binom{m}{Y}2^{(n-X)(m-Y)+1}(2^{X-1}2^{Y-1}+2^{X-1}2^{Y-1})\\ &=\sum\limits_{X\ge 1}^{}\sum\limits_{Y\ge 1}^{}(-1)^{X+Y}\binom{n}{X}\binom{m}{Y}2^{(n-X)(m-Y)+1}2^{X+Y-1}\\ &=\sum\limits_{X\ge 1}^{}(-1)^{X}2^x\binom{n}{X}\sum\limits_{Y\ge 1}^{}(-1)^Y\binom{m}{Y}(2^{n-X})^{m-Y}2^Y\\ &=\sum\limits_{X\ge 1}^{}(-1)^{X}2^x\binom{n}{X}\sum\limits_{Y\ge 1}^{}(-2)^Y(2^{n-X})^{m-Y}\binom{m}{Y}\\ &=\sum\limits_{X\ge 1}^{}(-1)^{X}2^x\binom{n}{X}((2^{n-X}-2)^m-(2^{n-X})^{m})\\ \end{aligned} \]


整体时间复杂度 \(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}\),有:

  1. \(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}\) 最大值。
  2. \(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. 店铺。
  2. 查询、删除、复制操作或新增冰淇淋。

初始只有店铺 \(1\)。对于 \(4\) 种操作:

  1. 将店铺 \(x\) 变成复制操作,然后给它挂两个儿子。一个还是店铺 \(x\),另一个是新的店铺。
  2. 将店铺 \(x\) 变成冰淇淋,然后给他挂一个儿子。表示店铺 \(x\)。
  3. 和操作 \(2\) 一样。
  4. 和操作 \(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\) 类:

  1. 非树边。
  2. 被 \(0\) 条非树边覆盖的树上边。
  3. 被 \(1\) 条非树边覆盖的树上边。
  4. 被至少 \(2\) 条非树边覆盖的树上边。

可能的合法情况有:

  1. \(e,f\) 中恰好有一条第 \(2\) 类边。设第 \(2\) 类边有 \(x\) 条,当前共 \(y\) 条边。方案数为 \(x(y-x)\)。
  2. \(e,f\) 中有一条是第 \(3\) 类边,且另一条恰好是覆盖他的非树边。设第 \(3\) 类边有 \(z\) 条。方案数为 \(z\)。
  3. \(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\),观察发生一场战争后排名的期望。

分情况讨论:

  1. \(x\) 没被选。排名不变。概率为 \(\frac{\binom{n-1}{2}}{\binom{n}{2}}\)。
  2. \(x\) 被选。排名改变。若另一个选择的是排名为 \(y\) 的人,交换后排名变成 \(y\)。概率为 \(\frac{1}{\binom{n}{2}}\)。

期望为:

\[\begin{aligned}\\ &\frac{\binom{n-1}{2}\cdot x + \sum\limits_{y\ne x}^{}y}{\binom{n}{2}}\\ &=\frac{\binom{n-1}{2}\cdot x + (\frac{n(n+1)}{2}-x)}{\binom{n}{2}}\\ &=\frac{\frac{(n-1)(n-2)}{2}\cdot x + \frac{n(n+1)}{2}-x}{\frac{n(n-1)}{2}}\\ &=(1-\frac{2}{n-1})\cdot x + (1+\frac{2}{n-1})\\ \end{aligned} \]

当 \(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\) 个。观察发生一场战争后的局面,分类讨论:

  1. 交换的文明对都不是被选择的文明。新状态为 \((x,c)\)。概率 \(\frac{\binom{n-i}{2}}{\binom{n}{2}}\)。
  2. 交换的文明对恰有一个是被选择的文明。
    1. 被选择的文明在 \([1,x]\),没被选择的文明在 \([1,x]\)。新状态为 \((x,c)\)。概率 \(\frac{c\cdot (x-c)}{ \binom{n}{2}}\)。
    2. 被选择的文明在 \([1,x]\),没被选择的文明在 \([x+1,n]\)。新状态 \((x,c-1)\)。概率 \(\frac{c\cdot (n-x-(i-c))}{\binom{n}{2}}\)。
    3. 被选择的文明在 \([x+1,n]\),没被选择的文明在 \([1,x]\)。新状态 \((x,c+1)\)。概率 \(\frac{(x-c)\cdot (i-c)}{\binom{n}{2}}\)。
    4. 被选择的文明在 \([x+1,n]\),没被选择的文明在 \([x+1,n]\)。新状态 \((x,c)\)。概率 \(\frac{(i-c)\cdot (n-x-(i-c))}{\binom{n}{2}}\)。
  3. 交换的文明对都是被选择的文明。
    1. 都在 \([1,x]\)。新状态 \((x,c)\)。概率 \(\frac{\binom{c}{2}}{\binom{n}{2}}\)。
    2. 都在 \([x+1,n]\)。新状态 \((x,c)\)。概率 \(\frac{\binom{i-c}{2}}{\binom{n}{2}}\)。
    3. 一个在 \([1,x]\),一个在 \([x+1,n]\)。新状态 \((x,c)\)。概率 \(\frac{c\cdot (i-c)}{\binom{n}{2}}\)。

整理一下,记转移前状态函数为 \(f'_i(x,c)\),转移后为 \(f_{i}(x,c)\)。有:

\[\begin{aligned}\\ f_{i}(x,c)&\gets f'_{i}(x,c)\cdot (\frac{\binom{n-i}{2}+c\cdot (x-c)+(i-c)\cdot (n-x-(i-c))+\binom{i}{2}}{\binom{n}{2}})\\ f_{i}(x,c-1)&\gets f'_{i}(x,c)\cdot (\frac{c\cdot (n-x-(i-c))}{\binom{n}{2}})\\ f_{i}(x,c+1)&\gets f'_{i}(x,c)\cdot(\frac{(x-c)\cdot (i-c)}{\binom{n}{2}}) \end{aligned} \]

发生 \(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\) 分类讨论:

  1. \(x=0,y=0\)。操作只能得到 \(0\)。
  2. \(x=0,y=1\)。操作能得到 \(0,1\)。
  3. \(x=1,y=0\)。操作能得到 \(0,1\)。
  4. \(x=1,y=1\)。操作能得到 \(0,1\)。

首先序列长度为奇数先手必败,因为最后一步后手一定可以让序列剩下 \(0\)。

整理一下可能的操作,相当于以下两种操作之一:

  1. 删去一个数。
  2. 将相邻两个 \(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\) 也看成匹配)。此时满足:

  1. 不存在 \(00\)。
  2. 所有 \(10\) 都在 \(01\) 前面。

\(f_i(0/1)\) 表示考虑完前 \(i\) 个位置,是否出现过 \(01\),且没出现过 \(00\) 的方案数。记 \(g_i(a,b)\) 表示 \(s_{i-1}=a,s_i=b\) 的方案数。有:

\[\begin{aligned}\\ f_i(0)&\gets f_{i-2}(0)\cdot(g_i(1,0)+g_i(1,1))\\ f_i(1)&\gets f_{i-2}(0)\cdot g_{i}(0,1) + f_{i-2}(1)\cdot(g_{i}(0,1)+g_i(1,1)) \end{aligned} \]

区间询问写成矩阵放线段树上面就行了。时间复杂度 \(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\) 分情况讨论:

  1. \(v_i \le x + 1\)。则 \(x' = x + v_i\)。
  2. \(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\)。

\[\begin{aligned}\\ &(\sum\limits_{j=0}^{i}\binom{c(y)}{j})\bmod 2\\ &=(\sum\limits_{j=0}^{i}\binom{c(y)-1}{j}+\binom{c(y)-1}{j-1})\bmod 2\\ &=\binom{c(y)-1}{i}\bmod 2\\ &= [i \&(c(y)-1) = i] \end{aligned} \]

那么:

\[\begin{aligned}\\ &(\sum\limits_{i=1}^{\frac{p}{100}\cdot c(x)}\prod\limits_{y\ne x}^{}[i \& (c(y) - 1) = i])\bmod 2\\ &=(\sum\limits_{i=1}^{\frac{p}{100}\cdot c(x)}\binom{\text{AND}_{y\ne x}^{} (c(y)-1)}{i})\bmod 2\\ &=(\binom{\text{AND}_{y\ne x}^{} (c(y)-1)-1}{\lfloor\frac{p}{100}\cdot c(x)\rfloor}-1)\bmod 2\\ &=[(\text{AND}_{y\ne x}^{} (c(y)-1) -1) \& (\lfloor\frac{p}{100}\cdot c(x)\rfloor) \ne (\lfloor\frac{p}{100}\cdot c(x)\rfloor)] \end{aligned} \]

一个区间只有 \(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.)

倒着做。

对最后一次运算分类讨论:

  1. $x'= x \text{ AND } a $。对于二进制下第 \(i\) 位:
    1. \(x'_i = 1, a_i = 1\)。此时 \(x_i =1\)。
    2. \(x'_i= 0,a_i =1\)。此时 \(x_i = 0\)。
    3. \(x'_i = 0, a_i = 0\)。此时 \(x_i = ?\)。
  2. \(x' = x \text{ OR } a\)。对于二进制下第 \(i\) 位:
    1. \(x'_i = 0, a_i = 0\)。此时 \(x_i = 0\)。
    2. \(x'_i = 1,a_i = 0\)。此时 \(x_i = 1\)。
    3. \(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\)。分情况讨论:

  1. \(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\)。
  2. \(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\)。那么原式等于:

\[\begin{aligned}\\ &\lfloor\frac{A}{a\cdot b}\rfloor + \lfloor\frac{A - C\cdot a\cdot b}{a}\rfloor+A\bmod a\\ &=\lfloor\frac{A}{a\cdot b}\rfloor + (\lfloor\frac{A }{a}\rfloor-C\cdot b)+A\bmod a\\ &=\lfloor\frac{\lfloor\frac{A}{a}\rfloor}{b}\rfloor + \lfloor\frac{A }{a}\rfloor\bmod b+A\bmod a\\ \end{aligned} \]

拓展到 \(k \ne 3\)。记 \(D_i = \frac{X_{i+1}}{X_{i}}\)。

设 \(S\) 为 \(A\) 日元所需最小纸币张数,那么 \(S\) 可以这么算出来:

  1. 枚举 \(i = 1\dots k-1\)。将 \(S\) 增加 \(A\bmod D_{i}\),并将 \(A\) 变成 \(\lfloor\frac{A}{D_i}\rfloor\)。

  2. 在枚举完 \(i\) 后,将 \(S\) 增加 \(A\)。

考虑 DP。

定义状态函数 \(f(A,B,C)\) 为如果要表示出 \(A,B,C\),所需的最小代价。枚举 \(D \ge 2\),分情况讨论:

  1. 是情况 \(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. 是情况 \(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\) 表示:

  1. 对 \(R+1 \ge \max(i,j)\)。有 \(b_{L-1}>d_{R+1},a_{L-1}<c_{R+1}\)。
  2. 对 \(\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}\)。
  3. 对 \(\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)\)。

posted @ 2026-11-03 21:41  harmis_yz  阅读(11)  评论(0)    收藏  举报