logo

yaohaoyou

春节

讲题-XDFZ

2026-01-30 Views 做题记录4811字23 min read

\Large\color{red}\Diamond 是关键转化。

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)

倒闭了,写不了一点,还要卡常,下播了。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)

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)

EOF