logo

yaohaoyou

春节

ZR暑假集训讲题

2026-08-03 Views 做题记录5627字29 min read

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

P15246 [WC2026] 猫和老鼠

感觉像是几个套路拼在一起的缝合题目,但我好像都无法快速识别。

先将这条数轴拉成一个平面图,x 轴是数轴,y 轴是时间,有左右边界 x=0x=0x=mx=m,那么 Jerry 需要从 (0,x)(0,x)(+inf,x)(+\inf,x'),而 Tom 需要通过若干条 (ai,ti)(bi,ti+biai)(a_i,t_i) \to (b_i,t_i+|b_i-a_i|) 的线段将这个平面图割开使 Jerry 无法通过。\Large{\color{red}\Diamond}

Tom 的线段都是斜率为 ±1\pm 1 的,Jerry 移动的斜率为 [1,1][-1,1],考虑将这个图顺时针旋转 45°45\degree 并扩大 2\sqrt2 倍(即将点 (x,y)(x+y,yx)(x,y) \to (x+y,y-x)),左右边界变成 y=xy=xy=x2my=x-2m。机器猫变成使用水平和竖直的线段将左右边界断开,有两种方式:

  1. 一条水平和竖直线段直接相交,阻止 Jerry 通过。
  2. 因为 Jerry 旋转后只能向右上(包含右和上)移动,所以可以使用两条不相交的线将 Jerry 的 x/y 坐标限制在一个区间中(如下图中红色线段是机器猫的不相交限制线段,Jerry 可以走绿色的路径,但到达了 ? 后就无法继续走)。

![](D:\yhy\Blog[WC2026] 猫和老鼠配图.png)

考虑刻画这样的限制,对于每条竖线,令上面的点是 in,下面的是 out,横线左边的是 in,右边的是 out。可以发现对于两种方式都能用以下方式刻画:inxoutxin_x \to out_x,对于满足 inxin_xoutyout_y 左上角的点连接 outyinxout_y \to in_x\Large{\color{red}\Diamond}若最后能从在 y=xy=x 的点到达 y=x2my=x-2m 的点,则经过的边的长度和就是 k=1k=1 时的答案。

继续拓展到 k>1k>1 的情况,要选出 kk 条不相交的,可以构建费用流模型 \Large{\color{red}\Diamond}

  1. SS 连向所有在 y=xy=x 上的点,容量为 11,费用为 00
  2. inxoutxin_x\to out_x 容量为 11,费用为 wxw_x
  3. outyinxout_y\to in_x 容量为 +/k+\infty / k,费用为 00
  4. 将所有在 y=x2my=x-2m 上的点连向 TT,容量为 11,费用为 00

答案就是这个图在流量为 kk 时的最小费用。注意 1144 的容量不是 +/k+\infty/k 是因为若在这个点重合时,Jerry 直接走到这个点只需要扣 11 的血量,而 33 是因为这条边只是虚构的边,实际画一下可以发现 Jerry 至少会扣两滴血量。

但是现在还是有 O(n2)\mathcal O(n^2) 条边,考虑优化建图,每个 outout 向左上角的 inin 连边,显然是一个二维偏序关系,使用主席树/可持久化树状数组优化即可。因为 flowflow 很小,使用原始对偶求费用流最后复杂度为 O(nklog2n)\mathcal O(nk\log^2n)

CF2097F Lost Luggage

好像应该之前讲过,但当时不会轮廓线 dp 就没改。

列出一个 m×nm\times n 的矩阵,其中 Gi,jG_{i,j} 表示第 ii 天机场 jj 剩余的行李数量。不难建出网络流模型:

  1. (i,j)(i+1,j1)(i,j) \to (i+1,j-1),容量为 ai,ja_{i,j}
  2. (i,j)(i+1,j)(i,j)\to (i+1,j),容量为 bi,jb_{i,j}
  3. (i,j)(i+1,j+1)(i,j)\to (i+1,j+1),容量为 ci,jc_{i,j}
  4. S(1,i)S\to(1,i),容量为 sis_i
  5. (k,i)T(k,i)\to T,容量为 ++\infty

kk 天的答案就是最大流,直接做复杂度是 O(nm3)\mathcal O(nm^3),无法通过。

考虑 nn 很小时的做法,因为最大流 = 最小割,所以可以考虑维护 nn 个点到 SS 的连通性来计算最小割。记 fi,j,S,0/1f_{i,j,S,0/1} 表示前 ii 行,目前到达 jj(i,[1,j)(i,[1,j)(i1,[j,n])(i-1,[j,n]) 的连通状态为 SS(i,j)(i,j) 是否连通 SS 的最小割。用轮廓线 dp 不难做到 O(nm2n)\mathcal O(nm2^n)

【UER #11】企鹅游戏

有结论:i=1mj=1n[ci,j>0]=O(L43)\sum_{i=1}^m\sum_{j=1}^n [c_{i,j}>0]=\mathcal O(L^\frac43),其中 ci,jc_{i,j} 表示 sjs_j 匹配 tit_i 的次数。证明:

所以若将 tit_i 放入 ss 构建的 AC 自动机中跑,只在成功匹配的 tt 中计数是能够接受的。建出一棵 endend 树,faxxfa_x \to x 表示 endpos(sfax)endpos(s_{fa_x})endpos(sx)endpos(s_x) 在 fail 树上最深的终点的祖先。对于每次询问 tt,将 tt 在 AC 自动机上匹配的 endposendpos 集合 SS 的所有点在 endend 树中暴力 dfs 子树并贡献答案即可,复杂度为 O(L43)\mathcal O(L^\frac43)

直接暴力 dfs 常数比较大,可以类似按照拓扑序,从原来加边的地方改成维护从下到上的链,常数较小可以通过。

P6640 [BJOI2020] 封印

最长公共子串考虑 SA。不难发现答案就是求 maxi=lrmin(ri+1,lcp(sufSi,sufTj))\displaystyle\max_{i=l}^r\min(r-i+1,lcp(sufS_i,sufT_j))。先把 S+#+TS+\#+T 拼起来,然后对于固定的 iilcp(sufSi,sufTj)lcp(sufS_i,sufT_j) 的最大值就是找 rkjrk_j 距离 rkirk_i 最近的属于 TTjj,只用找前面和后面即可。然后处理对 ri+1r-i+1 的限制,可以直接二分答案 xx,然后在 [l,rx+1][l,r-x+1] 中寻找最大的 lcp(sufSi,sufTj)lcp(sufS_i,sufT_j) 即可。复杂度为 O(nlogn+qlogn)\mathcal O(n\log n+q\log n)

OGF 入门题

给定 nnmm,你需要计数长度为 nn 的序列,每个数是 1,2,3,41,2,3,4 之一,满足 11 的数量减 22 的数量等于 mm

fi,j=fi1,j1+fi1,j+1+2fi1,j,f0,i=0Fi(x)=Fi1(x)(x+1x+2)Fn(x)=(x+1x+2)nans=[m](x2+2x+1x)nans=[n+m](x+1)2nans=[n+m]i=02n(2ni)xians=(2nn+m)f_{i,j}=\sum f_{i-1,j-1}+f_{i-1,j+1}+2f_{i-1,j},f_{0,i}=0 \\ F_i(x)=F_{i-1}(x)(x+\frac 1x+2) \\ F_n(x)=(x+\frac 1x+2)^n\\ ans=[m](\frac{x^2+2x+1}x)^n\\ ans=[n+m](x+1)^{2n} \\ ans=[n+m]\sum_{i=0}^{2n} \binom{2n}i x^i\\ ans=\binom{2n}{n+m}

P6624 [省选联考 2020 A 卷] 作业题

考虑拆开 val(T)val(T)

val(T)=(i=1n1wi)×gcd(w1,w2,,wn1)=(i=1n1wi)×dw1,dw2,dwn1φ(d)=dφ(d)[dw1dwn1]i=1n1wival(T)=(\sum_{i=1}^{n-1}w_i)\times \gcd(w_1,w_2,\dots,w_{n-1})\\ =(\sum_{i=1}^{n-1}w_i)\times \sum_{d|w_1,d|w_2,\dots d|w_{n-1}} \varphi(d) \\ =\sum_d \varphi(d)[d|w_1\wedge\dots\wedge d|w_{n-1}]\sum_{i=1}^{n-1}w_i\\

dd 的倍数的边拉出来做 Matrix-Tree 即可,但是还有问题就是矩阵树定理求解的是 wiw_i 的积的和,但我们需要求 wiw_i 的和。实际上 Matrix-Tree 的权值 wiw_i 不一定是常数,还可以是函数,所以将 wi=wix+1w'_i=w_ix+1,这样求出来的函数的一次项就是答案了\Large{\color{red}\Diamond}。做的过程只需要记录一次项和常数项即可,复杂度为 O(Vn3)\mathcal O(Vn^3),实际上准确的上界是 O(nmaxd(V)n3)\mathcal O(n\max d(V)n^3),可以通过。

AT_agc044_e Random Pawn

精妙的转化,积累一下套路。

首先不难发现可以在 maxai\max a_i 处断开,完成断环成链,移动至 a1=maxaia_1=\max a_i。令 fif_i 表示目前在 ii 的期望收益,不难列出方程fi=max(ai,fi1+fi+12bi)f_i=\max(a_i,\frac{f_{i-1}+f_{i+1}}2-b_i)。尝试将 bib_i 提出来做常数项,构造 gi=fi+dig_i=f_i+d_i\Large{\color{red}\Diamond}

gi=max(ai,fi1+fi+12bi)+digi=max(ai+di,gi1di1+gi+1di+12bi+di)gi=max(ai+di,gi1+gi+12di1+di+12di+2bi2)g_i=\max(a_i,\frac{f_{i-1}+f_{i+1}}2-b_i)+d_i \\ g_i=\max(a_i+d_i,\frac{g_{i-1}-d_{i-1}+g_{i+1}-d_{i+1}}2-b_i+d_i)\\ g_i=\max(a_i+d_i,\frac{g_{i-1}+g_{i+1}}2-\frac{d_{i-1}+d_{i+1}-2d_i+2b_i}2)\\

因为要让 max\max 后半部分的常数剔除,所以构造 di1+di+12di+2bi=0d_{i-1}+d_{i+1}-2d_i+2b_i=0,即 di=2bi1+2di1di2d_i=-2b_{i-1}+2d_{i-1}-d_{i-2},初始项随便设成 d0=d1=0d_0=d_1=0 即可。

gi=max(ai+di,gi1+gi+12)g_i=\max(a_i+d_i,\frac{g_{i-1}+g_{i+1}}2)

ai+dia_i+d_i 已经是常数了,考虑后面是一个类似取中点的形式,若将点 (i,gi)(i,g_i) 放到坐标系中,取后面的部分代表了 i1,i,i+1i-1,i,i+1 三点共线。但加上和常数取 max\max 时,发现会将 ii 的点往上提,会形成一个类似凸包的形态\Large{\color{red}\Diamond}。具体证明大概是 2gigi1+gi+12g_i\ge g_{i-1}+g_{i+1},即 gigi1gi+1gig_i-g_{i-1}\ge g_{i+1}-g_i,所以会形成一个下凸壳,注意有 an+1=a1a_{n+1}=a_1

AT_dwango2016qual_e 花火

好像依旧不太会 Slope Trick /ll

SiS_i 表示在 ii 时刻的烟花的位置集合,fi,jf_{i,j} 表示前 ii 时刻在 jj 的答案,不难列出 fi,j=mink=1jfi1,k+xSijxf_{i,j}=\min_{k=1}^j f_{i-1,k}+\sum_{x\in S_i}|j-x|。后面的 \sum 部分显然是下凸函数,然后可以归纳证明 Fi(x)=fi,jF_i(x)=f_{i,j} 也是下凸函数,考虑使用 Slope Trick。\Large{\color{red}\Diamond}

使用堆维护斜率拐点(经过堆中的拐点时斜率会 1-1),因为需要做前缀取 min\min,即将所有的斜率和 00min\min,考虑倒着维护从右往左的拐点。直接记录 k,bk,b 表示在 ++\infty 处的 F(x)=kx+bF(x)=kx+b,当加入 xp|x-p| 函数时,在 xpx\ge p 时会 kk+1,bbpk\gets k+1,b\gets b-p,到了 pp 处时还原成 pxp-x,即设置两个在 pp 处的拐点时 kk2,bb+2pk\gets k-2,b\gets b+2p

做完了加凸函数,然后再前缀取 min\min,直接从右往左走直到 k0k\le 0 时即可。复杂度 O(nlogn)\mathcal O(n\log n)。代码很好写,但理解了挺久的。

Pyh 的求和/P4240 毒瘤之神的考验

ans=i=1nj=1mφ(ij)=i=1nj=1mφ(i)φ(j)gcd(i,j)φ(gcd(i,j))=d=1min(n,m)dφ(d)i=1n/dj=1m/d[gcd(i,j)=1]φ(id)φ(jd)=d=1min(n,m)dφ(d)i=1n/dj=1m/dpi,pjμ(p)φ(id)φ(jd)=d=1min(n,m)dφ(d)p=1min(n,m)μ(p)i=1n/dpj=1m/dpφ(idp)φ(jdp)ans=\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\\ =\sum_{i=1}^n\sum_{j=1}^m\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}\\ =\sum_{d=1}^{\min(n,m)}\frac{d}{\varphi(d)}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} [\gcd(i,j)=1]\varphi(id)\varphi(jd) \\ =\sum_{d=1}^{\min(n,m)}\frac{d}{\varphi(d)}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} \sum_{p|i,p|j}\mu(p)\varphi(id)\varphi(jd) \\ =\sum_{d=1}^{\min(n,m)}\frac{d}{\varphi(d)}\sum_{p=1}^{\min(n,m)}\mu(p)\sum_{i=1}^{n/dp}\sum_{j=1}^{m/dp} \varphi(idp)\varphi(jdp) \\

预处理 fn=ij=niφ(i)μ(j)f_n=\sum_{ij=n}\frac{i}{\varphi(i)}\mu(j),预处理复杂度为 O(nlogn)\mathcal O(n\log n)

ans=x=1min(n,m)fx(i=1nxφ(ix))(j=1mxφ(jx))ans=\sum_{x=1}^{\min(n,m)} f_x(\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\varphi(ix))(\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}\varphi(jx))

预处理 gn,x=i=1xφ(in)g_{n,x}=\sum_{i=1}^{x}\varphi(in),复杂度还是 O(nlogn)\mathcal O(n\log n)

ans=x=1min(n,m)fxgx,nxgx,mxans=\sum_{x=1}^{\min(n,m)} f_xg_{x,\lfloor\frac nx\rfloor}g_{x,\lfloor\frac mx\rfloor}

现在 ansans 的形式还是对于 x[1,min(n,m)]x\in[1,\min(n,m)] 进行对位乘后求和,不太能直接优化,考虑根号分治。

对于 xBx\le B 时暴力跑上面的式子,复杂度 O(B)\mathcal O(B)。对于 x>Bx>B,预处理 hn,i,j=x=1nfxgx,igx,jh_{n,i,j}=\sum_{x=1}^n f_xg_{x,i}g_{x,j},再对第一维做前缀和(即hn,i,j=knhk,i,jh'_{n,i,j}=\sum_{k\le n} h_{k,i,j})。对 nnmm 做整除分块,有序对 (nx,mx)(\lfloor\frac{n}{x}\rfloor,\lfloor\frac{m}{x}\rfloor) 只有 O(n+m)\mathcal O(\sqrt n+\sqrt m) 种,复杂度为 O(n2B+Tn)\mathcal O({\color{red}\frac{n^2}B}+T\sqrt n)。总复杂度为 O(n2B+TB+Tn)\mathcal O(\frac{n^2} B+TB+T\sqrt n),平衡取 B=n2TB=\sqrt\frac{n^2}{T},视 n,Tn,T 同阶时,做到 O(nn)\mathcal O(n\sqrt n)

解释一下上面红色的为什么是 n2B\frac{n^2}B

Bnn2i2di=n2Bn\int_B^n \frac{n^2}{i^2}\,di=\frac{n^2}{B}-n

空间复杂度也是 O(n2B)\mathcal O(\frac{n^2}B) 的,再 LOJ 需要将 BB 稍微开大来卡空间。

P4213 【模板】杜教筛

sf(n)=i=1nf(i)sf(n)=\sum_{i=1}^n f(i),其中 ff 是积性函数。

构造积性函数 gg,有

i=1n(fg)(i)=i=1ndif(d)g(id)=d=1ng(d)i=1ndf(i)=d=1ng(d)sf(nd)\sum_{i=1}^n(f*g)(i)=\sum_{i=1}^n\sum_{d|i} f(d)g(\frac id) \\ =\sum_{d=1}^n g(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}f(i)\\ =\sum_{d=1}^ng(d)sf(\lfloor\frac{n}d\rfloor)

移项可以得到:

g(1)sf(n)=i=1n(fg)(i)d=2ng(d)sf(nd)g(1)sf(n)=\sum_{i=1}^n (f*g)(i)-\sum_{d=2}^n g(d)sf(\lfloor\frac nd\rfloor)

若能快速求出 fgf*ggg 的前缀和,就可以使用整除分块加速求出 sf(n)sf(n)。结论有,当能 O(1)\mathcal O(1) 求出 fgf*ggg 的前缀和时,若提前使用线性筛算出前面的 sf(n)sf(n),可以做到 O(n23)\mathcal O(n^\frac 23),不预处理复杂度是 O(n34)\mathcal O(n^\frac 34)

f=φf=\varphi 时,有 φ1=id\varphi*1=idg=1g=1fg=idf*g=id 的前缀和都能快速求。

f=μf=\mu 时,有 μ1=ϵ\mu*1=\epsilong=1g=1fg=ϵf*g=\epsilon

f(i)=φ(i)if(i)=\varphi(i)i,有 h(i)=(fid)(i)=diφ(d)did=idiφ(d)=i2h(i)=(f*id)(i)=\sum_{d|i}\varphi(d)d\frac{i}{d}=i\sum_{d|i}\varphi(d)=i^2g=idg=idfg=hf*g=h

[P4482 [BJWC2018] Border 的四种求法](P4482 [BJWC2018] Border 的四种求法)

给定字符串 ssqq 次询问求 s[l,r]s[l,r] 的 border 长度。

将 border 拆成前缀的后缀形式,答案就是最大的 xx 满足 x[0,rl],lcs(prel+x1,prer)xx\in [0,r-l],lcs(pre_{l+x-1},pre_r)\ge x。建出后缀树后有性质 lcs(prex,prey)=lenLCA(enx,eny)lcs(pre_x,pre_y)=len_{LCA(en_x,en_y)},其中 enien_i 表示 SAM 中以 ii 结尾的节点。所以题目就是要求 enren_r 的祖先 xx 的子树中满足 idp[l,r),idplenx+1lid_p\in[l,r),id_p-len_x+1\le l(其中可能将 LCA 算得更高,但是一定不优,所以没问题),其中 ideni=iid_{en_{i}}=i。这个不满足单调性,直接做不好做,考虑使用树剖将询问放到 logn\log n 个重链后离线处理。

对于一条重链,需要处理下面两种询问:

  1. 对于一个前缀 itpufaui\in tp_u\leadsto fa_u,求最大的 xendposix\in endpos_ix[l,r)x\in [l,r)xleni+1lx-len_i+1\le l
  2. 对于一个后缀 iulstui\in u\leadsto lst_u,求最大的 xendposix\in endpos_ix[l,r)x\in[l,r)xlenu+1lx-len_u+1\le l,即 x[l,min(l+lenu1,r1)]x\in[l,\min(l+len_u-1,r-1)]

其中 endposiendpos_i 表示 ii 子树中所有 enven_v 的集合,实际上可以只用枚举轻子树的,因为重子树会在下面算到。处理时直接遍历重链上 ii 的所有轻子树的总复杂度为 O(nlogn)\mathcal O(n\log n)\Large{\color{red}\Diamond},证明考虑树剖复杂度证明。对于 2 询问直接用 set 存下 endposendposlower_bound即可。对于 1 操作需要建线段树,维护 xleni+1x-len_i+1 的区间最小值,询问时在 [l,r)[l,r) 线段树上二分\Large{\color{red}\Diamond}。总复杂度为 O(nlog2n+qlog2n)\mathcal O(n\log^2n+q\log^2n)

P16958 [SCCPC 2026] 括号序列

ZROJ

什么脑电波推式子题?

不难想到枚举将哪一个)换成(后计算后面的方案数,根据路径相关计数方法,得到的答案(实际上还要加上前缀合法串的数量,简单这里不考虑)就是:

ans=si=)j=xi+1n/2(2jijxi1)(2jijxi2)=si=)j=0n/2xi1(2j+2xi+2ij)(2j+2xi+2ij1)ans=\sum_{s_i=)}\sum_{j=x_i+1}^{n/2}\binom{2j-i}{j-x_i-1}-\binom{2j-i}{j-x_i-2} \\ =\sum_{s_i=)}\sum_{j=0}^{n/2-x_i-1}\binom{2j+2x_i+2-i}{j}-\binom{2j+2x_i+2-i}{j-1} \\

其中 xix_i 表示前 ii 个位置的(数量,令 ci=2xi+2ic_i=2x_i+2-i。将组合数提取出来设成 ff

f(a,b)=i=0b(2i+ai)ans=si=)f(ci,n2xi1)f(ci+2,n2xi2)f(a,b)=\sum_{i=0}^b \binom{2i+a}{i}\\ ans=\sum_{s_i=)}f(c_i,\frac n2-x_i-1)-f(c_i+2,\frac{n}2-x_i-2)

通过对 ff 做差分,可以发现\Large{\color{red}\Diamond}

f(a,b)f(a1,b)=i=0b(2i+ai)(2i+a1i)=i=0b(2i+a1i1)=i=0b1(2i+a+1i)=f(a+1,b1)f(a,b)=f(a+1,b1)+f(a1,b)f(a1,b),f(a,b)f(a+1,b1),f(a,b)f(a,b),f(a+1,b)f(a,b)-f(a-1,b)=\sum_{i=0}^b\binom{2i+a}i-\binom{2i+a-1}{i}\\ =\sum_{i=0}^b\binom{2i+a-1}{i-1}\\ =\sum_{i=0}^{b-1}\binom{2i+a+1}{i}\\ =f(a+1,b-1)\\ \color{red}f(a,b)=f(a+1,b-1)+f(a-1,b)\\ f(a-1,b),f(a,b) \to f(a+1,b-1),f(a,b)\to f(a,b),f(a+1,b)

最后一行表明了可以 O(1)\mathcal O(1) 通过已知的 f(x1,y),f(x,y)f(x-1,y),f(x,y) 推导到 xx+1x\gets x+1,而最后要求解的式子中 ci+ic_i+i 是单调递增的(cici+11c_i-c_{i+1}\le 1),第二维也是单调递减的。考虑使用类似莫队的指针维护 f(a,b)f(a,b)\Large{\color{red}\Diamond}。总复杂度为 O(n)\mathcal O(n)

Good Night

ZROJ

aia_i 称为颜色。考虑对于线段树每个区间维护完全覆盖其的区间个数。具体地,先将 nn 个区间插入线段树,然后对于每个线段树节点记录它到根路径上经过的颜色种数 trptr_p。实际上,只需要维护颜色种数为 =0/=1/2=0/=1/\ge 2 即可。对于一次区间删除操作,可以类似看作对开始时插入操作的撤销,因为有 trptrsontr_p\le tr_{son},所以只需要检查儿子能否改变 trtr,若能就继续递归检查,否则结束。因为所有点只会变化至多 22 次,总复杂度为 O(nlogn)\mathcal O(n\log n)

EOF