logo

yaohaoyou

春节

寒假讲题

2026-01-30 Views 做题记录16479字79 min read

\Large{\color{red}\Diamond} 为重点转换步骤。

AT_arc201_b [ARC201B] Binary Knapsack

因为 WW 很大,所以不能是 01 背包的思路,应该想贪心。

思考偏序关系,由于不同重量只有 log2W\log_2W 种,并且两个 2x12^{x-1} 可以直接合并成 2x2^x,所以每次贪心取当前重量价值最大的一定更优。

WW 进行二进制拆位,从小到大,若当前第 ii 位为 11,则选一个重量为 2i2^i 的一定不劣。\Large{\color{red}\Diamond}

剩下的排序后两两合并成重量为 2i+12^{i+1} 的物品,继续递归子问题。

AT_arc200_e popcount<=2

将得到的 AA 序列全部异或 xx 后依旧满足情况,所以不妨将 AA 异或 A1A_1 后使 A1=0A_1=0。直接钦定 A1=0A_1=0,最后将答案 ×2m\times 2^m 即可。\Large{\color{red}\Diamond}

由于 A1=0A_1=0popcount(A1Ai)2popcount(A_1\oplus A_i)\le 2,所以 popcount(Ai)2popcount(A_i)\le2。接下来分情况讨论。

  • popcount(Ai)1popcount(A_i)\le1,没有其他限制了,方案数为 (m+1)n1(m+1)^{n-1}

  • 有且仅有一种 popcount(Ax)=2popcount(A_x)=2,方案数为 (m2)(4n13n1)\binom m 2(4^{n-1}-3^{n-1})

  • 有多种 popcount(Aa1,Aa2,..Aak)=2popcount(A_{a_1},A_{a_2},..A_{a_k})=2,且 popcount(Aa1&Aa2&..&Aak)=1,k2popcount(A_{a_1} \And A_{a_2} \And..\And A_{a_k})=1,k\ge2,方案数为 m((m+1)n12n1(m1)(3n12n1))m((m+1)^{n-1}-2^{n-1}-(m-1)(3^{n-1}-2^{n-1}))

  • 有且仅有三种 popcount(Ax,Ay,Az)=2popcount(A_x,A_y,A_z)=2,此时只能有这三种数和 00 出现,并且两两交的 popcount 都为 11,如 {Ax,Ay,Az}={3,5,6}\{A_x,A_y,A_z\}=\{3,5,6\}。方案数为 (m3)(4n13×3n1+3×2n11)\binom m 3(4^{n-1}-3\times 3^{n-1}+3\times 2^{n-1}-1)

P9140 THUPC 2023 初赛 背包

类似于P2371 墨墨的等式的思路,先取 civi\frac{c_i}{v_i} 最大的物品作为基准并设 m=vi,k=cim=v_i,k=c_i,由于若 VV' 可以被凑出,则 VV(modm)V'\equiv V(\bmod m)VV 可以通过加入多个 mm 凑出,所以将物品的总大小在 modm\bmod m 的剩余系上处理。\Large{\color{red}\Diamond}

对于 (V,C),VV(modm)(V',C'),V\equiv V'(\bmod m) 的情况,此时的总贡献为 C+VVmkC'+\frac{V-V'}mk,由于 Vm\frac V m 固定,所以需要使 CVmkC'-\lfloor\frac{V'}m\rfloor k 最大,将这个值设为同余最长路上的距离。转移时从 pp 加上物品 xx 后转移至 q=(p+vx)modmq=(p+v_x)\bmod mfq=fp+cxp+vxmkf_q=f_p+c_x-\lfloor\frac{p+v_x}m\rfloor k

转移过程中需要保证没有正环和 V>VV'>V

  • 若有正权环 u1u2...usizu1u_1\to u_2\to...\to u_{siz}\to u_1,由于转一圈后物品总体积一定为 mm 的倍数,而由于选择的基准为 ciwi\frac{c_i}{w_i} 最大,所以一定不如全部选择物品 ii,矛盾,所以不存在正权环。
  • i[1,n],vilimv=105\forall i\in[1,n], v_i\le lim_v=10^5。图上共有 mm 个点,因为没有正权环,所以每个点最多走过 11 次,走过的边数最多也只有 m1m-1 条,每条边增加的体积 limv\le lim_v,所以 V(limv)2=1010<1011V'\le (lim_v)^2=10^{10}<10^{11},所以 V<VV'<V\Large{\color{red}\Diamond}

由于有负边权,所以不能用 dijkstra。这个题数据水,最短路直接用 SPFA 就过了,正解应该使用转两圈的做法将复杂度做到 O(nm)O(nm)

建边的过程实际是枚举 i[1,n],u[0,m)i\in[1,n],u\in[0,m) 并连边 (u,(u+vi)modm,w)(u,(u+v_i)\bmod m,w),手玩一下(其实比较显然)可以发现对于 ii 会产生 gcd(vi,m)\gcd(v_i,m) 个环。由于本质上是在模意义下做完全背包,所以转移顺序并不影响。并且由于每个点只会在最短路上走一次,所以最短路只要在已知的 gcd(vi,m)\gcd(v_i,m) 个环上找到最小的 disdis 值,并用其转一圈更新这圈的其他点即可,也就是 x[0,vi):x(x+vi)mod(x+2vi)modm...xx\in[0,v_i):x\to (x+v_i)\bmod \to (x+2v_i)\bmod m\to...\to x。写代码时为了方便,可以不用找到 disdis 最小值,直接在环上转两圈更新即可,复杂度为 O(nm)O(nm)

P7320 「PMOI-4」可怜的团主

首先由一个结论是一棵树至少由 leaf2\lceil\frac{leaf}2\rceil 条路径覆盖,构造是将叶子按 dfs 序排序后,路径为 (lf1,lfleaf2),(lf2,lfleaf2+1)(lf_1,lf_{\lceil\frac{leaf}2\rceil}),(lf_2,lf_{\lceil\frac{leaf}2\rceil+1})\dots,若 leafleaf 是奇数则最后连一条 (1,lfleaf)(1,lf_{leaf})\Large{\color{red}\Diamond}

必要性显然,应为一条路径最多覆盖两个叶子。充分性是这样的路径可以使相邻两条路径都有交集。若有一个点 uu 没有被覆盖。

  • uu 有至少两个在 uu 儿子 dfs 序排列中相邻的 v,wv,w,则必有一条经过 vv 子树的路径与一条经过 ww 子树的路径相交,所以 uu 一定被覆盖。

  • uu 只有一个儿子,若有不在 uu 子树内的叶子则有一条从 uu 子树内到外的路径,否则从 1u1\to u 的路径上 degf=1deg_f=1,则存在从 uu 子树内到 11 的路径。

综上,至少用 leaf2\lceil\frac {leaf} 2\rceil 条路径一定能覆盖所有节点。

由于 n6\lceil\frac n 6\rceiln3\lfloor\frac n 3\rfloor 的关系与 x2\lceil\frac x 2\rceil 相似,所以考虑提出 dfs 树并看叶子考虑。\Large{\color{red}\Diamond}

显然,若 leafn3leaf\ge \lfloor\frac n 3\rfloor,则选择第二种并将叶子节点输出即可。反之 leaf<n3leaf < \lfloor\frac n 3\rfloor,则覆盖所有点的路径数 leaf2<n32<n6\lceil\frac {leaf} 2\rceil<\lceil\frac {\lfloor\frac n 3\rfloor} 2\rceil<\lceil\frac n 6\rceil,使用上述的叶子节点相互匹配的做法后,剩下的路径用 (x,x)(x,x) 浪费掉即可。

AT_agc037_d Sorting a Grid

从无序的状态转移到有序的状态可以倒着思考,从有序的状态思考能到达的状态的共同点。

由有序的状态进行每行重排后每行的值域集合不会变,设行重排后的矩阵为:

AAAAABBBBBCCCCCDDDDDEEEEE\begin{matrix} A&A&A&A&A\\ B&B&B&B&B\\ C&C&C&C&C\\ D&D&D&D&D\\ E&E&E&E&E\\ \end{matrix}

1Am,m+1B2m1\le A\le m,m+1\le B\le 2m \dots

列重排后矩阵的每一列都会包含 A,B,CA,B,C\dots 各一个,这是操作两步的必然结论。

最后一步再回到输入的乱序矩阵,则此时乱序矩阵进行行重排后需要满足每列都各有 A,B,CA,B,C\dots 各一个的性质。\Large{\color{red}\Diamond}

进行构造时将枚举 (i,j)(i,j) 后将 iai,j1m+nmi \leftrightarrow \lceil\frac {a_{i,j}-1} m\rceil+nm,由于每行有 mm 个数,每种字符会出现 mm 次,所以最终连出的是正则二分图(每个点度数都相同的二分图),每次需要寻找出一组完美匹配表示当前列的状态,随后删除这组边并继续寻找二分图完美匹配。本图任选一个左部点集合都满足 out(S)=Sout(S)=|S|,由于 Hall 定理,存在完美匹配,删除匹配后依旧满足 out(S)=Sout(S)=|S|,所以一定可以找出 mm 组完美匹配。\Large{\color{red}\Diamond}

AT_agc061_c First Come First Serve

dpidp_i 表示 [1,i][1,i] 的答案,转移为 dpi2dpi1Cdp_i\leftarrow 2dp_{i-1}-CCC 为容斥掉的方案数。设 ii 最终取的值为 ti{ai,bi}t_i\in\{a_i,b_i\},则 tit_iaia_ibib_i 时结果相同当且仅当 tj[ai,bi]\forall t_j\notin[a_i,b_i],思考如何容斥掉这一部分。

因为 ai<ai+1,bi<bi+1a_i<a_{i+1},b_i<b_{i+1},所以区间之间不存在包含。若使 tj[ai,bi]\not\exist t_j\in[a_i,b_i],则对于 Li=minj(bj>ai),Ri=maxj(aj<bi)L_i=\min j(b_j>a_i),R_i=\max j(a_j<b_i),当 j[Li,i)j\in[L_i,i)tj=ajt_j=a_jj(i,Ri]j\in(i,R_i]tj=bjt_j=b_j,可以使 k[Li,Ri]k\in[L_i,R_i] 都可以选出 tk[ai,bi]t_k\notin[a_i,b_i],即满足 tj[ai,bi]\not\exist t_j\in[a_i,b_i]\Large{\color{red}\Diamond}

所以对于 dpRidp_{R_i} 需要删去 aia_ibib_i 重复的贡献,由于此时 [Li,Ri][L_i,R_i] 的方案固定,所以 dpRidpLi1dp_{R_i}\leftarrow -dp_{L_{i-1}}

LiL_iRiR_i 直接二分或双指针即可,复杂度为 O(n)/O(nlog2n)\mathcal O(n)/\mathcal O(n\log_2n)

P6657 【模板】LGV 引理

感觉原本的定义还是比较复杂,尝试用比较简洁但不一定足够适用的讲述。

先构造矩阵

M=[f(sx1,sy1,tx1,ty1)f(sx1,sy1,txn,tyn)f(sx2,sy2,tx1,ty1)f(sx2,sy2,txn,tyn)f(sxn1,syn1,tx1,ty1)f(sxn1,syn1,txn,tyn)f(sxn,syn,tx1,ty1)f(sxn,syn,txn,tyn)]M=\left[\begin{matrix} f(sx_1,sy_1,tx_1,ty_1) & \dots & f(sx_1,sy_1,tx_n,ty_n)\\ f(sx_2,sy_2,tx_1,ty_1) & \dots & f(sx_2,sy_2,tx_n,ty_n)\\ &\ddots\\ f(sx_{n-1},sy_{n-1},tx_1,ty_1) & \dots & f(sx_{n-1},sy_{n-1},tx_n,ty_n)\\ f(sx_n,sy_n,tx_1,ty_1) & \dots & f(sx_n,sy_n,tx_n,ty_n)\\ \end{matrix}\right]

使用 LGV 引理需要保证存在构造(sxi,syi)(sx_i,sy_i) 到达 (txpi,typj)(tx_{p_i},ty_{p_j})nn 条路径之间互不相交,排列 pp 只能p={1,2,3..,n}p=\{1,2,3..,n\}。换言之,若 pii\exist p_i\neq i,则无法构造 nn 条互不相交的路径。LGV 引理只适用于 DAG。

LGV 引理:从 (sxi,syi)(sx_i,sy_i) 到达 (txi,tyi)(tx_i,ty_i)nn 条路径互不相交的方案数为 det(M)\det(M)

AT_agc057_d Sum Avoidance

神仙题,根本不可能想出来。

首先 A|A| 的上界显然是 S12\lfloor\frac {S-1} 2\rfloor,因为 (1,S1),(2,S2)(1,S-1),(2,S-2)\dots 不能同时存在,若 2S2|S,也不能出现 S2\frac S2。而这个上界也可以直接构造出来,只要取最大的 S12\lfloor\frac {S-1} 2\rfloor 个数即可,因为任意两个数相加已经 >S>S。此时想要让字典序尽量小。令选择的集合包括 A[1,S12]A\subseteq[1,\lfloor\frac {S-1} 2\rfloor]B[SS12,S1]B\subseteq [S-\lfloor\frac {S-1} 2\rfloor,S-1]

将字典序变小的过程就是将一些 xBx\in B 的换成 SxS-x。可以证明,直接从小到大,如果加入 xx 后依旧凑不出 SS,则在答案集合加入 xx 一定更优。\Large{\color{red}\Diamond}

证明:对于任意一个 x[1,S12]x\in [1,\lfloor\frac {S-1} 2\rfloor],若前面的数能凑出 xx,则加入 xx 不影响凑其他数。否则前面的数无法凑出 xx,则可以加入 SxS-x,由于后面的加入集合的数都 >x>x,所以不会导致 SxS-x 和其他数凑出 SS

这样就可以比较方便的 O(S)O(S) 求答案,思考如何继续加速贪心过程。

设加入的最小数为 dd,由于 dSd\not\mid Slcm(1,2,...43)>1018lcm(1,2,...43)>10^{18},所以 d43d\le43。思考两种添加方式,添加的数 xS12x\le \lfloor\frac {S-1} 2\rfloor

  1. xx 可以由 AA 中的数凑出。
  2. xx 不能被 AA 中的数凑出,但加入后也无法凑出 SS

11 的做法可以后面二分时再处理,思考 22 会加入哪些数。因为 dAd\in A,所以22 加入的数在 modd\bmod d 意义下互不相同,否则可以用 11 做出,所以 22 加入的数至多 O(d)\mathcal O(d),复杂度可以接受。\Large{\color{red}\Diamond}

fi,i[1,d)f_i,i\in[1,d) 表示 22 加入的数 modd=i\bmod d=i 的最小的数,转移时枚举加入 vv,若能加入需保证 f(Siv)modd+iv>Sf_{(S-iv)\bmod d}+iv>S,即保证

vmaxi=1d1(Sf(Siv)moddi+1)v\ge \max_{i=1}^{d-1}(\lfloor\frac{S-f_{(S-iv)\bmod d}}i\rfloor+1)

由于转移式中只与 vmoddv \bmod d 相关,所以枚举 x=vxmoddx = v_x\bmod d,按上面的式子跑一遍后将 vxv_x 加到 vxx(modd)v_x\equiv x(\bmod d) 为止。这一步需要枚举 xxii,单次复杂度为 O(d2)\mathcal O(d^2)。由于要从小到大进行贪心,所以对于所有的 vxv_x,每次只会选取最小的 vmnv_{mn} 更新所有的 ff。更新 ff 时枚举 i,j[1,d)i,j\in[1,d)

f(i+j×vmn)moddfi+j×vmnf_{(i+j\times v_{mn})\bmod d}\leftarrow f_i + j \times v_{mn}

由于每个 x[0,d)x\in [0,d) 只会有至多一次 x=mnx=mnfxf_x 更新至最小值(最终值),所以会进行 O(d)\mathcal O(d) 次上述的单次,复杂度为 O(d3)\mathcal O(d^3)

AAx\le x 的个数为 i=0d1max(0,xfid+[i=0])\sum_{i=0}^{d-1} \max(0,\lfloor\frac {x-f_i} d\rfloor+[i\not=0])。注意 f0=0f_0=0i=0i=0 时不加一是因为无法选取 0A0\in A

对于询问二分答案后求有多少个凑出的数 x\le x,对于 S12\le \lfloor\frac {S-1} 2\rfloor 的答案直接二分答案即可,>S12>\lfloor\frac {S-1} 2\rfloor 的答案先将 kkAk\leftarrow k-|A| 后反着二分。本题最终复杂度为 O(T(d3+dlog2k))\mathcal O(T(d^3+d\log_2k))

CF1389G Directing Edges

ran_qwq 的讲题,感觉有点像答辩缝合怪。

连通性和给无向边定向先想到使用边双缩点,因为一个边双内的点一定可以定向成强连通分量,这样一定更优。此时从无向图变成了一棵树,然后考虑关键点的限制。

先随便取一个关键点做根,若一个子树内没有关键点,则将边全部定向为 ufauu\rightarrow fa_u 一定不劣,由于这种子树的贡献固定,所以再缩起来。具体的,若一条边 (u,fau)(u,fa_u) 满足 uu 子树内没有关键点,而 faufa_u 子树内有关键点,则 [关键点能到达fau]=[关键点能到达u][\text{关键点能到达}fa_u]=[\text{关键点能到达}u],此时将 uu 子树和 faufa_u 缩到一起。此时所有叶子节点都是关键点。

可以开始树形 DP 了。令 fuf_u 表示 uu 子树内强制选 uu 为饱和点的收益,fu=max(fvw(u,v),0)+cuf_u=\max(f_v-w(u,v),0)+c_u,当让顶点 ii 强制选为饱和点时将 ii 钦定为根即可,写下换根 DP 即可。

代码没写,感觉依托。

CF1017G The Tree

lbw 的题感觉都很妙。

考虑将修改和查询的复杂度平衡,尝试类似于线段树标记永久化的思路。先不管 2 操作,若一个操作 1 v 能影响到 uu,则 vfauv\to fa_u 的点一定已经被标记为黑色,手玩可以发现修改之间的顺序其实不影响,所以将修改合并,即维护 cuc_u 表示在 uu 节点进行了 cuc_u 次操作,则操作 1 v 能影响到 uu 当且仅当 i is on path(v,u)cidepudepv+1\sum_\text{i is on path(v,u)}c_i\ge dep_u-dep_v+1,套路地,将 depudepv+1dep_u-dep_v+1 移到左边,分给每个 i is on path(v,u)\text{i is on path(v,u)}。将 cuc_u 的初始值设为 1-1,然后求最大后缀和(一定要包含自己)是否 0\ge 0 即可。

现在考虑操作 2 u,首先肯定要将 uu 子树内的所有 cic_i 设为 1-1,此外,需要让 uu 向上的最大后缀和变为 1-1,所以将 cucuquery(u)1c_u\gets c_u-query(u)-1

直接上树剖维护,复杂度 O(nlog2n)\mathcal O(n\log^2n)

AT_abc230_g [ABC230G] GCD Permutation

S(p)S(p) 表示满足 pp 命题的方案数。

ans=S(gcd(i,j)1gcd(Pi,Pj)1)=S(1)S(gcd(i,j)=1)S(gcd(Pi,Pj)=1)+S(gcd(i,j)=1gcd(Pi,Pj)=1)=n(n+1)22i=1nφ(i)+S(gcd(i,j)=1gcd(Pi,Pj)=1)ans=S(\gcd(i,j)\ne 1\wedge \gcd(P_i,P_j)\ne 1)\\ =S(1)-S(\gcd(i,j)=1)-S(\gcd(P_i,P_j)=1)+S(\gcd(i,j)=1 \wedge \gcd(P_i,P_j)=1)\\ =\frac{n(n+1)}2-2\sum_{i=1}^n \varphi(i)+S(\gcd(i,j)=1\wedge \gcd(P_i,P_j)=1)\\

只要解决 β=S(gcd(i,j)=1gcd(Pi,Pj)=1)=i=1nj=1n[gcd(i,j)=1gcd(Pi,Pj)=1]\beta=S(\gcd(i,j)=1 \wedge \gcd(P_i,P_j)=1)=\sum_{i=1}^n\sum_{j=1}^n [\gcd(i,j)=1\wedge\gcd(P_i,P_j)=1] 即可。

由莫反可得

β=x=1ny=1nμ(x)μ(y)i=1nj=1n[(xgcd(i,j))(ygcd(Pi,Pj))]=x=1ny=1nμ(x)μ(y)((xi,yPi1)+12)letf(x,y)=i=1n[xiypi]β=x=1ny=1nμ(x)μ(y)(f(x,y)+1)f(x,y)2\beta=\sum_{x=1}^n\sum_{y=1}^n \mu(x)\mu(y)\sum_{i=1}^n\sum_{j=1}^n[(x|\gcd(i,j))\wedge (y|\gcd(P_i,P_j))]\\ =\sum_{x=1}^n\sum_{y=1}^n\mu(x)\mu(y)\binom{(\sum_{x|i,y|P_i}1)+1}2\\ \text{let} f(x,y)=\sum_{i=1}^n [x|i\wedge y|p_i]\\ \beta=\sum_{x=1}^n\sum_{y=1}^n \mu(x)\mu(y) \frac{(f(x,y)+1)f(x,y)}2

每次加入一个新的数时枚举 xi,yPix|i,y|P_i 并修改对 β\beta 的贡献即可,复杂度为 O(nlnn+i=1nd(i)2)\mathcal O(n\ln n+\sum_{i=1}^n d(i)^2),打表得 N=2×105N=2\times10^5 时大约为 6×1076\times 10^7

P13997 【MX-X19-T6】「FeOI Round 4.5」はぐ

路径上求可以差分转化成四个点到根求,同时可能有 aiai±depia_i\gets a_i\pm dep_i,然后就是求 i=0dis(1,x)(api+k)\bigoplus_{i=0}^{dis(1,x)}(a_{p_i}+k),其中 pip_i11 走到 xx 的经过的第 ii 个点。每个位单独考虑,xkx_k 表示 xx 二进制下的第 kk 位的值,拆项得

(aj+k)i=(aj)iki[(ajmod2i+kmod2i)2i](a_j+k)_i=(a_j)_i\oplus k_i\oplus[(a_j\bmod 2^i+k\bmod 2^i)\ge2^i]

(aj)i\bigoplus(a_j)_i 可以直接预处理出根到 xxaa 的异或和,kk 直接看 depxdep_x 的奇偶性即可,最后一个考虑离线下来,将询问 (x,k,i)(x,k,i) 挂在 xx 上,使用 BIT 维护当前点祖先的 ajmod2ia_j \bmod 2^i 即可,复杂度为 O(nlog2n)\mathcal O(n\log^2 n)

One, Two, Three

怎么出了若干次的题都还没补过。

设共匹配 AA(1,2,3)(1,2,3)BB(3,2,1)(3,2,1),求 max(A+B)\max(A+B)。显然 (1,2,3)(1,2,3) 选定的一定是最左边的 AA11 和最右边的 AA33(3,2,1)(3,2,1) 同理。再分讨一下发现取的 (1,2,3)(1,2,3) 匹配 (ai,bi,ci)(a_i,b_i,c_i) 满足 a1<a2<<aAa_1<a_2<\dots<a_Ab1<b2<<bAb_1<b_2<\dots<b_Ac1<c2<<cAc_1<c_2<\dots<c_A 一定是不劣的,证明可以讨论 22 的位置。现在就可以将匹配对应到 A+BA+B 个区间了。

过程其实就类似二分图匹配,需要对 A+BA+B 个区间 [li,ri][l_i,r_i] 匹配所在区间内的 22。考虑 HALL 定理,即需要满足对于任意一个 S[A+B]S\in [A+B],满足 Scnt2([li,ri]),iS|S|\le cnt2(\cup [l_i,r_i]),i\in S,由于区间之间有偏序关系,即 li<lj,ri<rj\forall l_i<l_j,r_i<r_j,所以实际上 SS 取到一个区间是本质相同的,即 RL+1cnt2[lL,rR]R-L+1\le cnt2[l_L,r_R]

换一种说法,就是对于每一个区间 [l,r][l,r],令被 [l,r][l,r] 严格包含的区间数量为 fl,rf_{l,r},则满足 lr,fl,rcnt2[l,r]\forall l\le r,f_{l,r}\le cnt2[l,r]

对于每对 (A,B)(A,B),考虑 fl,rf_{l,r} 的下界,先考虑 (1,2,3)(1,2,3) 的情况,令 xcnt1(1,l1),ycnt3(r+1,n)x\gets cnt1(1,l-1),y\gets cnt3(r+1,n),则 [l,r][l,r] 需要包含 max(0,Ax)\max(0,A-x)11max(0,Ay)\max(0,A-y)33,按照匹配的顺序左右端点都单调可以发现 [l,r][l,r] 的最右边 yy11 和最左边 xx33 会被外面的点匹配,所以内部就会剩下 max(Axy,0)\max(A-x-y,0)(1,3)(1,3) 需要匹配,所以有 max(Axy,0)cnt2[l,r]\max(A-x-y,0)\le cnt2[l,r]

同理考虑 (3,2,1)(3,2,1) 的情况能得到 max(Acnt1[0,l1]cnt3[r+1,n],0)+max(Bcnt3[0,l1]cnt1[r+1,n],0)fl,rcnt2[l,r]\max(A-cnt1[0,l-1]-cnt3[r+1,n],0)+\max(B-cnt3[0,l-1]-cnt1[r+1,n],0)\le f_{l,r}\le cnt2[l,r]

分讨两个 max\max 的取值,就能得到 A,B,A+BA,B,A+B 的范围了,构造由于 (1,2,3)(1,2,3)(3,2,1)(3,2,1) 的区间内部满足左右端点都是单调的,所以在左端点加入,发现一个 22 时贪心匹配最小的右端点即可。时间复杂度为 O(n)\mathcal O(n)

AT_arc210_e [ARC210E] Subset Sum Gaps

首先 kk 的种树显然只有 O(log1.01A)\mathcal O(\log_{1.01}\sum A),所以不用担心输出不完的情况。显然有一个暴力,每次加入 aia_i 时将所有的和的加上 aia_i 后和原来的进行归并。

而正解就是基于此的优化,发现若过程中有两个相邻的和 si,si+1s_i,s_{i+1} 满足 sisi+1<1.01×sis_i\le s_{i+1}<1.01\times s_i,则后面过程中 1.01×si1.01\times s_i 和下一个数的差只会越来越大(同时因为 ai>0a_i>0,所以 1.01×ai>ai1.01\times a_i>a_i),不可能 0\le 0,所以此时 sis_i 就可以类似做删除处理。考虑记录若干个连续段的最左边和最右边的和以及长度,表示单个连续段内都不可能存在满足条件的和,而相邻连续段的相邻两个位置一定会满足条件,由最开始的证明,显然连续段个数也只有 O(log1.01A)\mathcal O(\log_{1.01}\sum A)。总复杂度为 O(nlog1.01A)\mathcal O(n \log_{1.01}\sum A)

AT_agc076_a [AGC076A] Hamming-Distant Arrays

给求的东西取反,f(x,y)=nd(x,y)f(x,y)=n-d(x,y),就是求有多少种 (x1,xn)(x_1,\dots x_n) 满足存在一个 yy 满足 f(xi,y)>nf(x_i,y)>n,所以显然有一个必要条件是 n2n^2 个位置每个位置的最大相同数的和 n2+n\ge n^2+n,不知道是不是充分的。

写完了,过了,那就是充要的了。复杂度 O(n5)\mathcal O(n^5)

P4948 数列求和

其实是这里的题目,感觉挺牛的,本质上应该还是快速幂,所以写一下。

fk(n)=i=1nikaif_k(n)=\sum_{i=1}^n i^ka^i

nn 为偶数时,令 mn2m\gets \frac n2\Large{\color{red}\Diamond}

fk(n)=i=1mikai+i=m+1nikai=fk(m)+ami=1m(i+m)kai=fk(m)+ami=1m(j=0k(kj)ijmkj)ai=fk(m)+amj=0k(kj)mkji=1mijai=fk(m)+amj=0k(kj)mkjfj(m)f_k(n)=\sum_{i=1}^{m}i^ka^i+\sum_{i=m+1}^n i^ka^i\\ =f_k(m)+a^m\sum_{i=1}^m (i+m)^ka^i\\ =f_k(m)+a^m\sum_{i=1}^m (\sum_{j=0}^k \binom{k}{j}i^jm^{k-j})a^i\\ =f_k(m)+a^m\sum_{j=0}^k\binom{k}{j}m^{k-j}\sum_{i=1}^mi^ja^i\\ =f_k(m)+a^m\sum_{j=0}^k\binom{k}{j}m^{k-j} f_j(m)\\

nn 为奇数时:

fk(n)=a+i=2nikai=a+ai=1n1(i+1)kai=a+ai=1n1j=0k(kj)ijai=a+aj=0k(kj)fj(n1)f_k(n)=a+\sum_{i=2}^n i^ka^i\\ =a+a\sum_{i=1}^{n-1}(i+1)^ka^i\\ =a+a\sum_{i=1}^{n-1}\sum_{j=0}^k\binom kj i^ja^i\\ =a+a\sum_{j=0}^k \binom kj f_j(n-1)

现在每次就能花费 O(k2)\mathcal O(k^2) 的代价将 nn2n\gets \lfloor \frac n2 \rfloor,并求出 i[1,k]\forall i\in [1,k]fi(n)f_i(n),所以一共有 logn\log n 层,复杂度为 O(k2logn)\mathcal O(k^2\log n)

P14829 [THUPC 2026 初赛] Asian Soul

感觉对树上 lca 性质还是不太熟练。

将询问挂在线段树上离线,这样即使对每个区间内的所有数操作也只有 O(nlogn)\mathcal O(n\log n)。要求一个点和多个点的分别的 lca,考虑先对每个线段树区间和插入其中的询问节点建出虚树,此时所有的 lca(ak,u)lca(a_k,u) 都会在虚树上出现。\Large\color{red}\Diamond

接下来只要处理在虚树上求答案了,令 fuf_u 表示 uu 子树内为线段树区间上的点的个数。思考一个点何时会作为 lca 产生贡献,即若一条虚树边 uvu \to v 满足 fu>fvf_u>f_v,则说明 vv 子树和 (uu 子树/vv 子树内的线段树区间中的点)之间的 lca 都为 uu,即 vv 子树内的询问都会获得 uu 的贡献。只要在 vv 打上标记下传即可。

总复杂度为 O((n+m+q)log2n)\mathcal O((n+m+q)\log^2 n),瓶颈在给所有区间建虚树。如果用单调栈建虚树,那一次排序可以在线段树上归并处理,复杂度少一个 log\log。注意要用 O(1)\mathcal O(1) lca。

Fake Plastic Trees 2

首先有个比较简单的 dp,令 fu,i,jf_{u,i,j} 表示 uu 子树内删了 ii 条边,目前 uu 连通块的大小为 jj 是否可行。

转移就类似树上背包合并,考虑如何优化 jj 这一维。

显然 jj 的最大值是 TuiLT_u-iL,最小值是 TuiRT_u-iR,其中 TuT_u 表示 uu 子树内的 AA 和,所以 jj 的极差 i(RL)\le i(R-L)

接着证明对于 j=x,y,z(x<y<z,zx<RL)j=x,y,z(x<y<z,z-x<R-L) 时,状态 yy 可以省略掉\Large\color{red}\Diamond,设选择了 yy 后最后形成的连通块大小为 sz[l,r]sz\in[l,r],则新增了 szysz-y,分讨后可以证明 szy+xsz-y+xszy+zsz-y+z 至少一个会 [l,r]\in [l,r],所以 yy 状态可以不计。此时所有记录的递增状态 j1,j2jsj_1,j_2\dots j_s 都满足 ji+2jiRLj_{i+2}-j_i\ge R-L,而又O(k)\mathcal O(k) 个。所以状态只有 O(nk2)\mathcal O(nk^2) 了,总复杂度为 O(nk3)\mathcal O(nk^3)。具体为什么不是 O(nk4)\mathcal O (nk^4),是因为 fu,if_{u,i}fv,jf_{v,j} 卷的时候由于树上背包的证明是 O(nk)\mathcal O(nk) 的,剩余两个卷积是 O(k2)\mathcal O(k^2) 的。

P9266 [PA 2022] Nawiasowe podziały

w(l,r)w(l,r) 表示区间 [l,r][l,r] 中所有子串中合法括号序列数量,可以证明 ww 满足四边形不等式。令 fi,jf_{i,j} 表示前 ii 个字符分成了 jj 段的方案数,则 fi,j=mink<ifk1,j1+w(k,i)f_{i,j}=\min_{k<i}f_{k-1,j-1}+w(k,i),所以 F(x)=fn,xF(x)=f_{n,x} 为下凸函数。

套路地,显示使用 wqs 二分,然后需要求 gi=minj<igj1+w(j,i)midg_i=\min_{j<i}g_{j-1}+w(j,i)-mid。因为 ww 满足四边形不等式,所以 gg 满足决策单调性,但 ww 不好直接求,并且 gg 求解过程需要在线。

发现 w(l,r)w(l,r) 在做 ll±1l\to l\pm 1rr±1r\to r\pm 1 时可以直接 O(1)\mathcal O(1) 求解,所以可以用 cdq 分治套决策单调性分治解决,复杂度为 O(nlog3n)\mathcal O(n\log^3n)。但是可以使用LARSCH/简化 LARSCH(感觉像科技)算法优化至 dp 部分只要 O(n)/O(nlogn)\mathcal O(n)/\mathcal O(n\log n),总复杂度为 O(nlogn/nlog2n)\mathcal O(n\log n/n\log^2n)\Large\color{red}\Diamond

简化 LARSCH 算法其实类似于 cdq 分治套决策单调性分治,令 optt(x)opt_t(x) 表示只考虑从 [1,t][1,t] 的转移到 xx 的最优决策,opt(x)=optx1(x)opt(x)=opt_{x-1}(x)。具体过程是定义 solve(l,r)solve(l,r) 表示已知 [1,l)[1,l)g,optg,optoptl1(r)opt_{l-1}(r),求解 [1,r][1,r]g,optg,opt

  1. i[optl1,optl1,r]i\in [opt_{l-1},opt_{l-1,r}] 求出 optl1(mid)opt_{l-1}(mid),因为 optt(x)optt(y)optt(z),x<y<zopt_{t}(x)\le opt_{t}(y)\le opt_{t}(z),x<y<z
  2. 调用 solve(l,mid)solve(l,mid)
  3. opt(i),i[l,mid]opt(i),i\in [l,mid]optl1(r)opt_{l-1}(r) 求出 optmid(r)opt_{mid}(r)
  4. 调用 solve(mid+1,r)solve(mid+1,r)

注意 1 操作中要移动 w1w1 的指针,3 操作中要移动 w2w2 的指针,可以证明整个过程中 w1w1w2w2 的指针一共只会移动 O(nlogn)\mathcal O(n\log n) 次,若两种操作移动同一对指针会退化到 O(n2)\mathcal O(n^2) 次。

P6782 [Ynoi2008] rplexq

考虑对于每个点的度数和儿子子树大小根号分治,对于度数 B\le B 的点的询问考虑暴力枚举每个儿子,>B>B 的点只有 O(n)\mathcal O(\sqrt n) 个再考虑优化。\Large\color{red}\Diamond

f(u,l,r)f(u,l,r) 表示 uu 子树中编号在 [l,r][l,r] 的点的数量,则对于询问 (l,r,x)(l,r,x) 答案就是 (f(x,l,r)2)v is son of x(f(v,l,r)2)\binom{f(x,l,r)}2-\sum_\text{v is son of x}\binom{f(v,l,r)}{2}。对于 degxndeg_x\le \sqrt n,直接枚举 vv 后就会形成 O(nn)\mathcal O(n\sqrt n) 个求子树内编号在 [l,r][l,r] 的数量的询问,把子树用 dfs 序拍掉就是 O(n)\mathcal O(n) 个点 O(nn)\mathcal O(n\sqrt n) 次询问二维数点,离线后就是 O(n)\mathcal O(n) 次单点加,O(nn)\mathcal O(n\sqrt n) 次区间求和,可以使用分块内记录块内和块间前缀和做到 O(n)O(1)\mathcal O(\sqrt n)-\mathcal O(1) 修改/查询,复杂度为 O(nn)\mathcal O(n\sqrt n)。但是空间还是 O(nn)\mathcal O(n\sqrt n),因为要存下 O(nn)\mathcal O(n\sqrt n) 个询问,可以发现 xx 的儿子的询问区间互不相交,所以可以扫描求完最小的区间后再把下一个加入,空间就是 O(n)\mathcal O(n) 的了。

剩下考虑 degx>ndeg_x >\sqrt n 的怎么做。再次考虑分成两种情况,对于 xx 的儿子 vv 的子树大小 >n>\sqrt n 的,xx 只会有 n\sqrt n 个这种儿子,可以理解为度数只有 n\sqrt n,所以直接套用上面的做法即可。\Large\color{red}\Diamond对于 vv 子树大小 n\le \sqrt n,直接暴力 O(sizv2)\mathcal O(siz_v^2) 枚举出所有二元组 (x,y),x<y(x,y),x<y,若满足 lx<yrl\le x< y\le r 就会贡献答案,这也是一个二维偏序(数点),但是现在有 O(nn)\mathcal O(n\sqrt n) 对修改,O(m)\mathcal O(m) 个询问,使用 O(1)O(n)\mathcal O(1)-\mathcal O(\sqrt n) 的分块处理即可。这部分的复杂度还是 O(nn)\mathcal O(n\sqrt n) 的,修改简单处理就可以做到线性空间。

总结一下就是直接对于每个点的儿子子树中前 n\sqrt n 大的做 O(n)O(1)\mathcal O(\sqrt n) -O(1) 的二维数点,对剩余的做 O(1)O(n)\mathcal O(1)-\mathcal O(\sqrt n) 的二维数点。

Omniscient Artist

首先将二维数点离线扫描线改成对 aa 做区间 ±1\pm 1,由于 aina_i\le n,所以 mm 的倍数只会有 O(nm)\mathcal O(\frac nm) 种。考虑以 BB 为块长做序列分块,区间加是好做的,由于初始时 aa 的差分数组都是 ci=0c_i=0,每次区间加会让 clcl±1,cr+1cr+11c_l\gets c_{l}\pm 1,c_{r+1}\gets c_{r+1}\mp 1,只会有 O(n)\mathcal O(n) 次区间加,所以 ci2n\sum |c_i|\le 2n,所以每个块内的 maxmin\max-\min 的和是 O(n)\mathcal O(n) 级别的。询问时对每个块内枚举 mm 的倍数并查询出现次数即可,mm 的倍数一共只会有 O(maxminm)\mathcal O(\frac {\max-\min} m) 个,所以查询复杂度为 O(nm)\mathcal O(\frac n m),区间加复杂度为 O(nB+B)\mathcal O(\frac nB+B),平衡后整体复杂度为 O(nn)\mathcal O(n\sqrt n)。注意重构的时候应该对每个块内的数删除而不是 O(maxmin)\mathcal O(\max-\min) 的清空,否则复杂度会退化到 O(n2)\mathcal O(n^2)

P14836 [THUPC 2026 初赛] 能量分配

这也太困难了。

p317p\gets 317,固定 cc 数组后,分配宝石的方案数就是 (nc1,c2,cm)\binom {n}{c_1,c_2,\dots c_m},由 Lucas 定理的过程可以得到 (nc1,c2cn)0(modp)\binom{n}{c_1,c_2\dots c_n}\not\equiv 0(\bmod p) 的必要条件是 k,bitk(ci)=bitk(n)\forall k,\sum bit_k(c_i)=bit_k(n),其中 bitk(x)bit_k(x) 表示 xxpp 进制下的第 kk 位,即需要满足 ci\sum c_i 求和过程中不能在 pp 进制下进位。\Large\color{red}\Diamond

先考虑 n<pn<p,此时就只有一层。考虑直接枚举排序后 cic_i 之间的偏序关系,即相邻的两个位置之间的关系是 < 还是 =,一共只有 O(2m1)\mathcal O(2^{m-1}) 种。然后在确定相对偏序关系后,(nc1,c2cm)\binom n {c_1,c_2\dots c_m} 的贡献和 A,BA,B 造成的贡献就独立了,分别考虑。\Large\color{red}\Diamond

先考虑求出 A,BA,B 的贡献。令 dpS1,S2dp_{S1,S2} 表示已经填入了集合 S1S1 的选手,前面的偏序关系是 S2S2 的贡献和,转移考虑枚举一个新的极长的相等段,选手编号集合为 S3S3,然后可以提前预处理出 wS1,S3w_{S1,S3} 造成的贡献进行转移。复杂度为 O(i=1m(mi)×2i1×2mi)=O(4m)\mathcal O(\sum_{i=1}^m \binom{m}{i}\times 2^{i-1}\times 2^{m-i})=\mathcal O(4^m)

然后考虑求 (nc1,c2cm)\binom{n}{c_1,c_2\dots c_m} 的贡献。由于 cic_i 的顺序不影响,所以这里只计算 cc 有序时的贡献和。令 fi,j,Sf_{i,j,S} 表示前 ii 个数和为 jj,相对偏序关系为 SS 的总贡献,转移时讨论 ci+1c_{i+1}cic_i 的偏序关系。复杂度为 O(i=1m2i1p2)=O(2mp2)\mathcal O(\sum_{i=1}^m 2^{i-1}p^2)=\mathcal O(2^mp^2)

拓展到 npn\ge p,现在一共有 logpn\log_p n 层。类似上面的做法,将两种贡献分开计算,A,BA,B 造成的贡献直接 O(4m)\mathcal O(4^m) 预处理即可。考虑如何适应层数对偏序关系的影响。从高位到低位,原本相等的一段区间可能会分裂成几个有序的区间,考虑用 dp 记录这个过程。令 fi,Sf_{i,S} 表示到达 ii 层时的偏序关系为 SS 的方案数(bit2(S)=[cici+1]bit_2(S)=[c_i \ne c_{i+1}]),考虑从 fi,Sf_{i,S} 转移到 fi1,Sf_{i-1,S'}SSS\sube S') 的转移系数 gS,S,biti1(n)g_{S,S',bit_{i-1}(n)},实际上 gS,S,ig_{S,S',i} 可以将这个过程分成 SS 的每个 0 区间(等价类)变成 SS' 对应区间后对 bitk(c)\sum bit_k(c) 维做卷积得来的。具体的,令 hS,ih_{S,i} 表示相对偏序关系为 SSc=i\sum c=i 的方案数,则 (S,S)(S,S') 的转移可以通过 hS,ih_{S,i} 的第二维 ii 的和卷积得来。hh 的转移和上一段落中的类似,gg 的状态中有许多可以通过记忆化解决\Large\color{red}\Diamond,比如下图中三个绿色段的相对顺序不会影响 gg 的值,所以可以将其排序后存入map进行记忆化。令map的大小为 F(m)F(m),则预处理 gg 的复杂度为 O(F(m)p2)\mathcal O(F(m)p^2)。若没有记忆化,F(m)=3mF(m)=3^m(即枚举 SSS\sube S'),但是显然记忆化后会大幅减少状态数,实际上 F(12)=17547\color{red}F(12)=17547。对于每次询问跑 ff 转移后记得最后与前面算的 A,BA,B 造成的贡献 dpdp 拼起来。总复杂度为 O(4m+F(m)p2+q3mlogpn)\mathcal O(4^m+F(m)p^2+q3^m\log_p n)

![](能量分配 配图.png)

倒闭了,写不了一点,还要卡常,下播了。upd. 改完了。

最小乘积

由于 A,BA,B 很小,所以考虑直接枚举其中一个。令 fu,if_{u,i} 表示到 uu 时经过的 a=i\sum a=i 的最小的 b\sum b,转移不难发现由于 ai>0a_i>0,所以这个转移是分层图,可以从小到大枚举 ii 后枚举每条边转移,复杂度为 O((n+m)mV)\mathcal O((n+m)mV),若没有发现分层图直接跑 dijkstra 会多一只 log 无法通过。

CF280D k-Maximum Subsequence Sum

由于 kkk\sum k 很小,可以考虑模拟费用流。首先有个显然的费用流模型,对每个 ii 连边 (S,i,1,0),(i,i+1,1,ai),(i,T,1,0)(S,i,1,0),(i,i+1,1,a_i),(i,T,1,0),还有 kk 的限制所以答案就是在这个图中增广 kk 次的最大花费。每次增广就是找到当前的最大区间和,然后将经过的链上的边反向并将费用变成相反数 \Large\color{red}\Diamond。这个过程可以使用线段树模拟,就是做最大子段和还有区间取相反数,复杂度为 O(qlogn+knlogn)\mathcal O(q\log n+\sum kn\log n)

其实也可以从反悔贪心的方面思考刚刚的过程,就是先取当前和最大的区间 [l,r][l,r],然后反悔再选取 [l,r][l,r][l',r'] \sube [l,r] 并减去 sum[l,r]sum[l',r'],这样区间就断成了 [l,l)[l,l')(r,r](r',r],完成了反悔操作,也就对应模拟费用流的反向弧的操作。

Poor Students

依旧是模拟费用流。首先这显然是一个带权二分图匹配问题,考虑建立费用流后如何优化。

如果手玩这个退流和走反向弧的过程不难发现每次实际上就是在右边选出一个序列 p1,p2,pmp_1,p_2,\dots p_m 满足 p[1,m)p[1,m) 都曾经被流满了(匹配完 cpic_{p_i} 个左部点了),然后不断进行退流操作(即走反向弧)直到最后走到了一个没有流满的点 pmp_m 后走到 TT,下图红色的边就体现了退流的过程。由于 mk10m\le k\le 10,所以考虑对右部点做一些本质的操作。\Large\color{red}\Diamond实际上每次寻找最短路时可以看作从 pip_i 走到 pi+1p_{i+1},距离就是 pixpi+1p_i\to x \to p_{i+1} 两条边的距离之和,这个可以提前预处理出任意两个右部点的 xx 的集合处理,所以就是已知任意两个右部点之间的距离求一条最短路 rsrtrs\rightsquigarrow rt 且保证 rtrt 没有流满。直接 O(k3)\mathcal O(k^3) 跑 floyd 即可,由于要模拟退流,所以要记录转移点来复原路径。复杂度为 O(nk3+nk2logn)\mathcal O(nk^3+nk^2\log n)

![](Poor Students 配图.png)

Cool Problem

题解做法简直抽象。

将两个操作变得更相似,可以发现

ri=0:cix+y2=ci1+xy2ri=1:cix+y2=ci1xy2r_i=0:c_i-\frac{x+y}2=c_{i-1}+\frac{x-y}2 \\ r_i=1:c_i-\frac{x+y}2=-c_{i-1}-\frac{x-y}2 \Large\color{red}\Diamond

所以任意操作后都有 (cix+y2)2=(ci1+xy2)2(c_i-\frac{x+y}2)^2=(c_{i-1}+\frac {x-y}2)^2,拆开得到 ci2ci12(x+y)ci(xy)ci1+xy=0c_i^2-c_{i-1}^2-(x+y)c_i-(x-y)c_{i-1}+xy=0。对于 i[1,n]i \in[1,n] 求和后就得到了 cn2ycn+nxy=x(ci+ci+1)c_n^2-yc_n+nxy=x\sum(c_i+c_{i+1}),由于 f(r)=cif(r)=\sum c-i,所以 f(r)=cn2+(xy)cn+nxy2xf(r)=\frac{c_n^2+(x-y)c_n+nxy}{2x},所以知道 cnc_n 就能直接求出 f(r)f(r) 了。由于每次操作二都会将之前的 yy 的系数 ×(1)+1\times(-1)+1,由归纳法可得 yy 的系数只会是 0/10/1,所以只会有至多 2n2ncnc_n,求解直接设 fi,j{0,1},kf_{i,j\in\{0,1\},k} 表示前 ii 个数 yy 的系数为 jjxx 的系数为 kk 是否可行,转移用 bitset 优化,复杂度 O(n2ω)\mathcal O(\frac{n^2}\omega),要滚动数组。

CF1098F Ж-function

*3500。这种题写还是算了,太恐怖了一点。Ж(l,r)f(l,r)\operatorname{Ж}(l,r)\to f(l,r)

f(l,r)=i=lrlcp(s[l,r],s[i,r])=i=lrmin(lcp(s[l,n],s[i,n]),ri+1)f(l,r)=\sum_{i=l}^r|\operatorname{lcp}(s[l,r],s[i,r])|=\sum_{i=l}^r|\min(\operatorname{lcp}(s[l,n],s[i,n]),r-i+1)|

由于 lcp(s[i,n],s[j,n])=mink=rki+1rkjhtk\operatorname{lcp}(s[i,n],s[j,n])=\min_{k=rk_{i}+1}^{rk_{j}}ht_k,所以考虑将 i[l,r]i\in [l,r] 分成 rki<rklrk_i< rk_lrki>rklrk_i>rk_li=li=l,然后将询问挂在 rklrk_l 上。后面其实就是数据结构的事了。

rki>rklrk_i>rk_lrki<rklrk_i<rk_l 是本质相同的,这里只讨论前者。区间最小值的拆贡献考虑离线后对 rkrk 分治,令 sufi=minj=imidhtjsuf_i=\min_{j=i}^{mid} ht_jprei=minj=midihtjpre_i=\min_{j=mid}^i ht_j。从 midLmid\to L 扫描线,当遇到询问 [l,r][l,r] 时,令 mn=sufrklmn=suf_{rk_l},满足mid<ip,preimn\forall mid<i\le p,pre_i\ge mnpp 最大,mnmn 单调不降,prepre 单调不降,因此 pp 单调不降,考虑拆开贡献成 i=mid+1p[sai[l,r]]min(mn,rsai+1)+i=p+1R[sai[l,r]min(prei,rsai+1)]\sum_{i=mid+1}^p [sa_i\in [l,r]]\min(mn,r-sa_i+1)+\sum_{i=p+1}^R[sa_i\in [l,r]\min(pre_i,r-sa_i+1)]。前半部分是讨论对 (sai,i)(sa_i,i) 的二维数点,扫 pp 的时候加入树状数组即可。后半部分当 preirsai+1pre_i\le r-sa_i+1 时还需要满足 sai[l,r],i[p+1,R]sa_i\in [l,r],i\in [p+1,R],所以是对 (i,sai,sai+prei)(i,sa_i,sa_i+pre_i) 的三维数点,考虑优化。题解做法是将限制拆成 mnrsai+1mn\le r-sa_i+1 加上 preirsai+1<mnpre_i\le r-sa_i+1< mn,因为 prei<mnpre_i< mn。第一个限制是二维数点,乍一看第二个限制还是三维数点,但是由于对于 i(mid,p]i\in (mid,p] 的都满足 preimnpre_i\ge mn,所以就忽略掉了对 i[p+1,R]i\in [p+1,R] 的限制也不会多算,所以就改成了二维数点。\Large\color{red}\Diamond其他的讨论都类似就算了。

复杂度为 O((n+q)log2n)\mathcal O((n+q)\log^2n)

最短路径

由于每次询问只会删除一个点,所以可以考虑缺一分治。\Large\color{red}\Diamond同时由于 n300n\le 300,所以考虑用 floyd 做最短路。具体的令 solve(l,r)solve(l,r) 表示进入时 [1,l)[1,l)(r,n](r,n] 都已经加入图中并处理完最短路,则答案直接离线后在 solve(pi,pi)solve(p_i,p_i) 中求即可。每次加入一段区间 [l,r][l,r] 只要将其设为 floyd 中的转移点即可,因为不是它作为转移点的在之前已经处理过了,大概过程就是 i[l,r],j[1,n],k[1,n]:fj,kfj,i+fj,ki\in[l,r],j\in [1,n],k\in [1,n] :f_{j,k}\gets f_{j,i}+f_{j,k},这个过程单次复杂度为 O(n2siz)\mathcal O(n^2siz),由于在分治过程中 siz=O(nlogn)\sum siz=\mathcal O(n\log n),所以总复杂度为 O(n3logn+q)\mathcal O(n^3\log n+q)。由于 floyd 无法删除,撤销只能记录当时的最短路数组后拷贝,所以空间复杂度是 O(n3)\mathcal O(n^3)

No Rest for the Wicked

每次新到达的点 xx 都要满足 txmaxct_x\ge maxc,所以考虑从小到大枚举 maxcmaxc 并转移能到达的最大 ss。若 ti<maxct_i<maxc 则现在无法被加入和到达,直接全部删除不考虑。剩余的若 cimaxcc_i\le maxc 则当前点可以转移到其他点也可以被转移到,将其称为 1 类点,否则只能被其他点到达转移称为 2 类点。若一条边连接了两个 1 类点,则可以互相转移,令 bel(x)bel(x)xx 所在的极大 1 类点连通块。而 1 类点连向 2 类点的边只能单向转移,并且 2 类点当前无法再向外转移,所以最后的图就是若干个 1 类连通块像菊花一样向外连若干条单向边。

对于一条边 (u,v)(u,v) 会在 maxc[max(cu,cv),min(tu,tv)]maxc\in [\max(c_u,c_v),\min(t_u,t_v)] 时称为 1 类边,在 maxc[cu,min(tu,cv1)]maxc\in [c_u,\min(t_u,c_v-1)] 时成为 2 类边,注意反向边也要建。考虑如何顺着这个图进行转移,由于连通块之间的信息是相同的,而且不好撤销,而一条边会在一个区间出现,所以套路地使用线段树分治,1 类连通块用可撤销并查集维护。复杂度为 O(nlog2n)\mathcal O(n\log^2n)

其实到这一步时可以求出每个时刻每个连通块的答案,但是还无法将连通块的贡献传到每个点。优化可以发现对于一条无向边 (u,v)(u,v),其产生的 1 类边时间一定完全晚于 2 类边时间,所以需要在线段树上倒着扫 maxcmaxc,否则就会导致先扫到的 2 类点在被删掉后更新 1 类连通块。

CF997C Sky Full of Stars

容斥一下,方案数为

ans=i+j>0(1)i+j1(ni)(nj)f(i,j)ans = \sum_{i+j>0}(-1)^{i+j-1}\binom{n}{i}\binom{n}{j}f(i,j)

其中 f(i,j)f(i,j) 表示至少有 ii 列同色和 jj 行同色的方案数,则 f(0,i)=f(i,0)=3i+n(ni)f(0,i)=f(i,0)=3^{i+n(n-i)}f(i,j)=3n2(i+j)n+ij+1f(i,j)=3^{n^2-(i+j)n+ij+1}i=0i=0j=0j=0 分开讨论,剩下是 i,j>0i,j>0

i,j>0(1)i+j1(ni)(nj)3n2(i+j)n+ij+1=3n2+1i=1n(1)i13in(ni)j=1n(1)j(nj)3jn+ij=3n2+1i=1n(1)i3in(ni)j=1n(nj)((3n+i))j\sum_{i,j>0}(-1)^{i+j-1}\binom ni\binom nj3^{n^2-(i+j)n+ij+1} \\ =3^{n^2+1}\sum_{i=1}^n (-1)^{i-1}3^{-in}\binom ni\sum_{j=1}^n(-1)^j\binom nj 3^{-jn+ij}\\ =-3^{n^2+1}\sum_{i=1}^n (-1)^{i}3^{-in}\binom ni\sum_{j=1}^n\binom nj (-(3^{-n+i}))^j

看到 jj 式子的很像二项式定义,考虑

((3n+i)+1)n=j=0n(nj)(3n+i)jj=1n(nj)((3n+i))j=((3n+i)+1)n1(-(3^{-n+i})+1)^n=\sum_{j=0}^n\binom nj(-3^{-n+i})^j \\ \sum_{j=1}^n\binom nj (-(3^{-n+i}))^j=(-(3^{-n+i})+1)^n-1

然后把式子带回去就可以 O(nlogn)\mathcal O(n\log n) 做完了。

CF1716F Bags with Balls

\begin{align} \sum F^k &= \sum_{i=0}^k{k\brace i}i!\sum \binom{F}{i} \\ &= \sum_{i=0}^k{k\brace i}i!\binom{n}{i}\lceil\frac{m}2\rceil^i m^{n-i} \end{align}

第二个式子是因为考虑 (Fi)\binom Fi 的组合意义就是在所有的奇数编号球中选择 ii 个的方案数,所以可以先钦定被选择的 ii 个位置选奇数,然后剩下的随便选。代码实现时将 i!(ni)i!\binom ni 转成了 nin^{\underline i} 求解,复杂度 O(Tk2)\mathcal O(Tk^2)。枚举 ii 时动态维护 nin^{\underline i} 做到 O(Tk)\mathcal O(Tk)

P12999 [GCJ 2022 #3] Mascot Maze

神秘困难图染色构造题,这个 S=13|S|=13 甚至有用。

先把限制 ansuansvans_u\neq ans_v 的边 (u,v)(u,v) 先建出来,无向边数只有 6n6n 条,若有自环则显然无解。考虑稀疏图的性质,由于有向边数只有 12n12n,而一共只有 nn 个点,由鸽巢原理得至少有一个点的度数 12\le 12\Large\color{red}\Diamond,否则至少会有 13n13n 条有向边,矛盾。然后删除一个点后一定还有至少一个点度数 12\le 12,所以可以考虑做一个拓扑排序类似的事情。取到拓扑序后倒着染色,每个点此时至多会有 1212 条出度,但是有 1313 种颜色,所以可以染上。

P7220 [JOISC 2020] 掃除

考虑将一个在二维上的点 (x,y)(x,y) 转化成一维上的一段区间 [x,ny][x,n-y] \Large\color{red}\Diamond,由于所有的点在直角三角形中所以一定有 x+ynx+y\le n。然后发现 H 操作就是将 rnL,lmax(l,nL)r\ge n-L,l\gets \max(l,n-L),V 操作就是将 lL,rmin(r,L)l\le L,r\gets \min(r,L)。考虑建立猫树(线段树)后将所有区间挂上去,下面只考虑操作 H 对于 rx,lmax(l,x)r\ge x,l\gets \max(l,x)

xmidx\le mid,则需要将所有区间按照 ll 排序后取一段前缀推平成 xx,直接维护 ll 相同的连续段即可。

x>midx>mid,则所有当前线段树节点上的区间都会被移动到右儿子,这个过程对于每个区间显然只会出现 O(logn)\mathcal O(\log n) 次,所以直接暴力将当前节点的区间取出后全部重新插入即可。

维护这个过程应该直接对每个线段树节点都使用堆和 odt 维护就可以了。总复杂度为 O((n+q)log2n)\mathcal O((n+q)\log^2n),难写+难调+速度慢+空间大。

P12962 [GCJ Farewell Round #4] Genetic Sequences

题面太臭了,其实就是要求:

nA,mBmaxi=1PLCP(A[i,P],B[mS+1,m])=maxi=1Pmin(Pi+1,LCP(A[i,n],B[mS+1,m]))n\gets |A|,m\gets |B|\\ \max_{i=1}^P \operatorname{LCP}(A[i,P],B[m-S+1,m]) \\ =\max_{i=1}^P \min(P-i+1,\operatorname{LCP}(A[i,n],B[m-S+1,m])) \\

求两个串后缀的 LCP,套路地对串 A+#+B 做 SA\Large\color{red}\Diamond,则答案就变成了

maxi=1Pmin(Pi+1,minj=rki+1rklenS+1htj)\max_{i=1}^P\min(P-i+1,\min_{j=rk_i+1}^{rk_{len-S+1}} ht_j)

后面的 min\min 实际上是上下界可能会相反,大概意思知道就行了。

这个区间 min\min 还是不太好求,考虑将 rkirk_i 排序后建立对应的 htht 的小根笛卡尔树,然后就将区间 min\min 转化成求笛卡尔树上的 LCA\Large\color{red}\Diamond。考虑枚举 rklenQ+1rk_{len-Q+1} 的 LCA 为 uu,则对答案贡献 min(Pmnu+1,htu)\min(P-mn_u+1,ht_u),其中 mnumn_u 表示 uu 子树内的编号最小值。发现 uu 越往上 mnumn_u 越小,Pmnu+1P-mn_u+1 越大,htuht_u 越小,所以可以在链上二分求解两个函数交点就是答案。复杂度 O((n+m+q)log(n+m))\mathcal O(\sum (n+m+q)\log (n+m))

CF1874E Jellyfish and Hack

fi,jf_{i,j} 表示长度为 ii 的排列,当前的权值和为 jj 的方案数。

fi,j=k=0i1l=0ji(i1k)fk,lfi1k,jilf_{i,j}=\sum_{k=0}^{i-1}\sum_{l=0}^{j-i} \binom{i-1}k f_{k,l}f_{i-1-k,j-i-l}

由于第二维的大小为 O(n2)\mathcal O(n^2) 的,所有直接做复杂度是 O(n6)\mathcal O(n^6),即使用 FFT 也只能做到 O(n4logn)\mathcal O(n^4\log n)

看到第二维是卷积形式,考虑对序列 fif_i 做生成函数\Large\color{red}\Diamond。令 Fi(x)=j=in2fi,jxjF_i(x)=\sum_{j=i}^{n^2}f_{i,j} x^j,则转移式可以写成

Fi=k=0i1(i1k)xiFkFi1kF_i=\sum_{k=0}^{i-1}\binom{i-1}k x^i F_kF_{i-1-k}

由于 FiF_i 是一个至多 n2n^2 次的多项式,所以只要求出 O(n2)\mathcal O(n^2) 个点值后拉差即可复原系数。\Large\color{red}\Diamond对于每个 ii 维护 gi,j=Fi(j)g_{i,j}=F_i(j),卷积时直接对位乘即可,最后要给 n2n^2 次多项式做拉差复杂度为 O((n2)2)=O(n4)\mathcal O((n^2)^2)=\mathcal O(n^4)

这题能对 FFT 加速的主要原因是需要做 O(n2)\mathcal O(n^2) 次卷积,若只维护点值单次做卷积的复杂度就是 O(n2)\mathcal O(n^2),最后在拉差还原时也是 O(n4)\mathcal O(n^4) 的。若只做一次,拉差还原部分就已经是 O(n2)\mathcal O(n^2) 的,不如暴力。

已知 kk 次多项式的 k+1k+1 个点值,O(k2)\mathcal O(k^2)还原多项式。

将拉格朗日插值式子展开:

\begin{align} f(x)&=\sum_if(x_i)\prod_{j\neq i}\frac{x-x_j}{x_i-x_j} \\ &=\sum_{i}\frac{f(x_i)}{\prod_{j\neq i}(x_i-x_j)} \prod_{j\neq i} (x-x_j) \\ \end{align}

前半部分的值是已知的,直接 O(k2)\mathcal O(k^2) 枚举 i,ji,j 求即可,后半部分就是多个一次函数相乘,直接每次暴力展开是 O(k3)\mathcal O(k^3) 的,但是可以写成 (xxj)xxi\frac{\prod(x-x_j)}{x-x_i},然后预处理 (xxi)\prod(x-x_i) 的系数后每次做大除法即可,复杂度为 O(k2)\mathcal O(k^2)

2026 省选模拟赛 Day 17 #B. 追忆

假的追忆,但更困难了。

首先这个题的空间是开不下 O(n2)\mathcal O(n^2) 的 bitset 的,但是由于只需要求可达的集合大小,所以可以类似将 [1,n][1,n] 按照 BB 分块\Large\color{red}\Diamond,每次只求到达一个块内元素的可达性,空间为 O(nB)\mathcal O(nB),时间为 O(n2ω+n2B)\mathcal O(\frac{n^2}\omega+\frac{n^2}B),只要将 BB 开到刚好卡到空间限制就基本不会对时间复杂度有影响。

其实这个矩阵内的点是假的,就算开到空间内的点/k 维偏序也只是常数上的区别,因为都已经有 O(n2ω)\mathcal O(\frac{n^2}\omega) 的复杂度了就不用考虑怎么拆多维偏序了,直接对于每一维求出在询问区间内的点的集合,然后全部 & 起来就是满足的集合。需要求满足的点的可达集合,就可以先对每个点 uu 记录 bsu,ibs_{u,i} 表示 uu 是否在第 ii 个询问中,然后转移时跑拓扑排序,将 uu 可达的点 tt 都做 bstbstbsubs_t\gets bs_t \vee bs_u 表示 tt 会贡献到询问 ii \Large\color{red}\Diamond

现在有一个 n×qn\times qbitset 记录了 bsu,ibs_{u,i} 表示 uu 是否会贡献到询问 ii,若把其当成一个 01 矩阵,则第 ii 个询问的答案就是第 ii 列的和。考虑 诡异操作 的 trick,记录 cnti,jcnt_{i,j} 表示第 ii 列的和的第 jj 个二进制位,然后将 cntcnt 转置后就变成了一个 log2n×q\log_2n \times q 的矩阵,每次做对两个矩阵的每一行依次做二进制加法,单次复杂度为 O(qlognω)\mathcal O(\frac{q\log n}\omega),做 nn 次加法复杂度就是 O(nqlognω)\mathcal O(\frac{nq\log n}{\omega})。但是可以使用分治将 logn\log n 进一步减小,具体的,每次递归求解 [l,mid][l,mid][mid+1,r][mid+1,r] 的和,再做一次加法,复杂度 T(n)=2T(n2)+O(qlognω)T(n)=2T(\frac n2)+\mathcal O(\frac{q\log n}\omega),由主定理可以得到 T(n)=O(nqω)T(n)=\mathcal O(\frac{nq}\omega),虽然都是做 n1n-1 次加法,但分治可以将 logn\log n 不卡满,所以复杂度少一个 log\log。总复杂度为 O(nqω)\mathcal O(\frac{nq}\omega),需要使用第一段的卡空间方法,将 qq 次询问分块处理,平衡后时间复杂度做到 O(nqω+qB)\mathcal O(\frac{nq}\omega+qB),空间 O(nBω)\mathcal O(\frac{nB}\omega)

EOF