2022.10 做题记录

P2634 [国家集训队] 聪聪可可

钦定根为 11.

令 CuC_u 表示 uu 的儿子构成的集合,FuF_u 表示节点 uu 的父亲,w⁡(u,v)\operatorname{w}(u,v) 表示 (u,v)(u,v) 这条边的权值,d⁡(u,v)\operatorname{d}(u,v) 表示 uu,vv 之间的距离.

设 fu,kf_{u,k} 表示在 uu 的子树中满足 d⁡(u,v) mod 3=k\operatorname{d}(u,v)\bmod3=k 的 vv 的个数,gu,kg_{u,k} 表示在树中满足 d⁡(u,v) mod 3=k\operatorname{d}(u,v)\bmod3=k 的 vv 的个数.

容易得出 ff 的转移:

fu,k=∑v∈Cufv,k−w⁡(u,v) mod 3f_{u,k}=\sum_{v\in C_u}f_{v,k-\operatorname{w}\left(u,v\right)\bmod3}

我们由换根 dp 套路可以得到 gg 的转移:

gu,k=fu,k+gFu,k−w⁡(Fu,u) mod 3−fu,k−2w⁡(Fu,u) mod 3g_{u,k}=f_{u,k}+g_{F_u,k-\operatorname{w}\left(F_u,u\right)\bmod3}-f_{u,k-2\operatorname{w}\left(F_u,u\right)\bmod3}

答案即为:

1n2∑i=1ngi,0\frac{1}{n^2}\sum_{i=1}^{n}g_{i,0}

P3953 [NOIP2017 提高组] 逛公园

令原图为 G(V,E)G(V,E),(u,v)∈E(u,v)\in E 的权值为 w⁡(u,v)\operatorname{w}(u,v),图中从 11 到 uu 的最短路长为 dud_u.

设 fu,kf_{u,k} 表示从 11 到 uu 长度为 du+kd_u+k 的路径条数.

考虑转移.假设 fu,kf_{u,k} 可由 fv,xf_{v,x} 转移而来.我们有下式:

dv+w⁡(u,v)+x=du+kd_v+\operatorname{w}(u,v)+x=d_u+k

解得 x=du−dv+k−w⁡(u,v)x=d_u-d_v+k-\operatorname{w}(u,v).

那么我们有转移:

fu,k=∑(u,v)∈Efv,du−dv+k−w⁡(u,v)f_{u,k}=\sum_{(u,v)\in E}f_{v,d_u-d_v+k-\operatorname{w}(u,v)}

答案即为:

∑i=0kfn,i\sum_{i=0}^{k} f_{n,i}

P7453 [THUSCH2017] 大魔法师

考虑向量序列 α1,α2,⋯ ,αn\alpha_1,\alpha_2,\cdots,\alpha_n,其中 αi=(ai,bi,ci,1)\alpha_i=\left(a_i,b_i,c_i,1\right).

考虑修改操作.发现所有修改操作都可以通过矩阵乘法的形式来表示,具体如下:

  1. ai=ai+bia_i=a_i+b_i,修改时乘上的矩阵如下:

(1000110000100001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

  1. bi=bi+cib_i=b_i+c_i,修改时乘上的矩阵如下:

(1000010001100001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

  1. ci=ci+aic_i=c_i+a_i,修改时乘上的矩阵如下:

(1010010000100001)\begin{pmatrix} 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

  1. ai=ai+va_i=a_i+v,修改时乘上的矩阵如下:

(100001000010v001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ v & 0 & 0 & 1 \\ \end{pmatrix}

  1. bi=vbib_i=vb_i,修改时乘上的矩阵如下:

(10000v0000100001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & v & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

  1. ci=vc_i=v,修改时乘上的矩阵如下:

(10000100000000v1)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & v & 1 \\ \end{pmatrix}

把我们的向量序列丢到线段树上,只需要提供区间和查询和区间乘修改即可.

不知道为什么大家都在说卡常,我没卡常也能过.

P5607 [Ynoi2013] 无力回天 NOI2017

令 ⊕\oplus 代表按位 xor\mathrm{xor} 运算.

记原序列为 aa.

设序列 bb,其中 bi=ai⊕ai−1b_i=a_i\oplus a_{i-1}.

可以发现这样的序列 bb 具有和差分数组类似的性质,这样我们的区间修改就变成了单点修改.

对于每次查询的区间 [l,r][l,r],我们可以发现对于 i∈[l,r]i\in[l,r],我们有:

ai=al⊕⨁k=l+1ibka_i=a_l\oplus\bigoplus_{k=l+1}^{i}b_k

也就是说 al,al+1,⋯ ,ara_l,a_{l+1},\cdots,a_r 可被 al,bl+1,bl+2,⋯ ,bra_l,b_{l+1},b_{l+2},\cdots,b_{r} 表出,所以二者的基等价.

那么我们直接在线段树上维护 bb 的线性基,查询时取出 bl+1,bl+2,⋯ ,brb_{l+1},b_{l+2},\cdots,b_r 的线性基,然后插入 ala_l 进行查询即可.

注意对 l=rl=r 和 r=nr=n 的判定.

P3177 [HAOI2015] 树上染色

看到题目容易想到设 fu,if_{u,i} 为 uu 子树中选择 ii 个节点染成黑色时的最大受益.但是这样没法转移,所以寄.

考虑每条边的边权对答案的贡献,容易得到对于每种颜色的节点,11 条边对答案的贡献即为其两侧同为这种颜色的节点数的乘积.

令 sus_{u} 表示以 uu 为根的子树的大小,CuC_u 表示 uu 的儿子构成的集合,w⁡(u,v)\operatorname{w}(u,v) 为树上 (u,v)(u,v) 这条边的权值.

设 fu,if_{u,i} 表示在 uu 的子树中选择 ii 个节点染成黑色时对答案的贡献,我们可以得到转移:

fu,i=max⁡v∈Cu{max⁡j=0sv{fu,i−j+fv,j+w⁡(u,v)×j(k−j)+w⁡(u,v)×(n−k+j−sv)(sv−j)}}f_{u,i}=\max_{v\in C_u}\left\{\max_{j=0}^{s_v}\left\{f_{u,i-j}+f_{v,j}+\operatorname{w}(u,v)\times j(k-j)+\operatorname{w}(u,v)\times(n-k+j-s_v)(s_v-j)\right\}\right\}

树形背包转移即可.

P1284 三角形牧场

发现三角形的周长一定.设为 cc.

设 fi,jf_{i,j} 表示是否存在边长为 i,j,c−i−ji,j,c-i-j 的三角形.

设 ii 为当前考虑到前 ii 位,容易得到转移:

fj,k=fj−ai,k∨fj,k−aif_{j,k}=f_{j-a_i,k}\lor f_{j,k-a_i}

转移时注意负下标.

最后枚举可行方案,Heron 公式计算面积即可.

比题解第 1 篇的效率高不少.

P1282 多米诺骨牌

注意到数据范围允许我们枚举差值.

设 fi,jf_{i,j} 表示考虑前 ii 个骨牌,差值为 jj 的最小旋转次数.

显然有 fx,y=∞,f0,0=0f_{x,y}=\infty,f_{0,0}=0.

枚举差值 jj,我们有转移:

fi,j+ai−bi=min⁡{fi,j+ai−bi,fi−1,j}fi,j+bi−ai=min⁡{fi,j+bi−ai,fi−1,j+1}\begin{aligned} f_{i,j+a_i-b_i} &= \min\left\{f_{i,j+a_i-b_i},f_{i-1,j}\right\} \\ f_{i,j+b_i-a_i} &= \min\left\{f_{i,j+b_i-a_i},f_{i-1,j}+1\right\} \end{aligned}

转移后找到绝对值最小的 xx 使得 fn,x≠∞f_{n,x}\not=\infty,min⁡{fn,x,fn,−x}\min\left\{f_{n,x},f_{n,-x}\right\} 即为答案.

P1850 [NOIP2016 提高组] 换教室

记图中 u,vu,v 两点间的最短路距离为 wu,vw_{u,v},显然可以用 Floyd 预处理.

设 fi,j,0f_{i,j,0} 为考虑了前 ii 个时间段,已经申请了 jj 次换教室,且本次不申请的消耗的体力值总和的期望的最小值;fi,j,1f_{i,j,1} 为本次申请的.

显然有 f1,0,0=0,f1,1,1=0f_{1,0,0}=0,f_{1,1,1}=0.

考虑转移:

fi,j,0←min⁡{fi−1,j,0+wci−1,ci,fi−1,j,1+ki−1wdi−1,ci+(1−ki−1)wci−1,ci}fi,j,1←min⁡{fi−1,j−1,0+kiwci−1,di+(1−ki)wci−1,ci,fi−1,j−1,1+ki−1kiwdi−1,di+(1−ki−1)kiwci−1,di+ki−1(1−ki)wdi−1,ci+(1−ki−1)(1−ki)wci−1,ci}\begin{aligned} f_{i,j,0} \leftarrow \min\{&f_{i-1,j,0}+w_{c_{i-1},c_i},f_{i-1,j,1}+k_{i-1}w_{d_{i-1},c_i}+\left(1-k_{i-1}\right)w_{c_{i-1},c_i}\} \\ f_{i,j,1} \leftarrow \min\{&f_{i-1,j-1,0}+k_iw_{c_{i-1},d_i}+\left(1-k_i\right)w_{c_{i-1},c_i}, \\ &f_{i-1,j-1,1}+k_{i-1}k_iw_{d_{i-1},d_i} \\ &+\left(1-k_{i-1}\right)k_iw_{c_{i-1},d_i} \\ &+k_{i-1}\left(1-k_i\right)w_{d_{i-1},c_i} \\ &+\left(1-k_{i-1}\right)\left(1-k_i\right)w_{c_{i-1},c_{i}}\} \end{aligned}

答案即为:

min⁡i=0m{fn,i,0,fn,i,1}\min_{i=0}^m \{f_{n,i,0},f_{n,i,1}\}

CF372C Watching Fireworks is Fun

先考虑朴素 dp.

设 fi,jf_{i,j} 表示放第 ii 个烟火的时候在第 jj 个区间的最大开心值.

不难想到转移:

fi,j←max⁡k=j−d(ti−ti−1)j+d(ti−ti−1){fi−1,k+bi−∣ai−k∣}f_{i,j}\leftarrow \max_{k=j-d\left(t_i-t_{i-1}\right)}^{j+d\left(t_i-t_{i-1}\right)}\left\{f_{i-1,k}+b_i-\left|a_i-k\right|\right\}

然而注意到 n≤1.5×105,m≤300n\le1.5\times10^5,m\le300,朴素 O(n2m)O\left(n^2m\right) 的转移会 TLE.

考虑优化转移过程.

首先显然可以滚掉 1 维,然后不难发现转移瓶颈在求:

max⁡k=j−d(ti−ti−1)j+d(ti−ti−1)fi−1,k\max_{k=j-d\left(t_i-t_{i-1}\right)}^{j+d\left(t_i-t_{i-1}\right)}f_{i-1,k}

所以我们直接套上线段树,维护滚掉 1 维之后的 ff 即可.

然而 O(nmlog⁡n)O\left(nm\log n\right) 仍然会 TLE.

发现每次转移求最值的区间固定为 [j−d(ti−ti−1),j+d(ti−ti−1)][j-d\left(t_i-t_{i-1}\right),j+d\left(t_i-t_{i-1}\right)],可以想到单调队列.

时间复杂度为 O(nm)O\left(nm\right),可以通过本题.

P2962 [USACO09NOV] Lights G

首先基于模拟退火的随机化可以拿到优秀的 88 分.

首先可以先把每个点和其直接相连的点压到一个 uint64_t 里,操作相当于给当前状态异或上该点的状态.

显然对每个点进行的操作次数不会超过 11.

观察到 n≤35n\le 35,朴素 O(2n)O\left(2^n\right) 暴力会 TLE.

考虑 meet in the middle,分前后两块分别暴力,合并直接取 min⁡\min 即可.

CF1689C Infected Tree

容易发现病毒感染会在叶子节点和只有 11 个儿子的节点停止,且途经从根到该节点的链上所有节点.

记最后被感染的点的深度为 dd.

被感染的节点的数量为 dd.

当在叶子节点处停止时,删除的点的数量为 d−1d-1.

当在只有 11 个儿子的节点处停止时,删除的点的数量为 dd.

从根开始搜索,遇到满足条件的点记录并更新答案即可.

CF1689D Lena and Matrix

考虑 Manhattan 距离转 Chebyshev 距离.

对点 A(x0,y0)A\left(x_0,y_0\right) 进行变换得到点 A′(x0+y0,x0−y0)A^\prime\left(x_0+y_0,x_0-y_0\right),记该变换为 F⁡(A)\operatorname{F}\left(A\right).变换后 22 点之间的 Chebyshev 距离即为原来的 Manhattan 距离.

记 W\texttt{W} 点的集合为 WW,B\texttt{B} 点的集合为 BB.

对于点 P∈WP\in W,能对 PP 点的答案造成贡献的只有以下 44 个值:

max⁡Q∈BxF⁡(Q),min⁡Q∈BxF⁡(Q)max⁡Q∈ByF⁡(Q),min⁡Q∈ByF⁡(Q)\begin{aligned} \max_{Q\in B}x_{\operatorname{F}\left(Q\right)},\min_{Q\in B}x_{\operatorname{F}\left(Q\right)}\\ \max_{Q\in B}y_{\operatorname{F}\left(Q\right)},\min_{Q\in B}y_{\operatorname{F}\left(Q\right)} \end{aligned}

遍历每个点,答案取 min⁡\min 即可.

P1453 城市环路

基环树上的 没有上司的舞会.

随意在环上选择一条边断掉,设这条边所连接的 22 个点为 u,vu,v.

分别以 u,vu,v 作为根进行树形 dp,状态和转移与没有上司的舞会相同.

答案取 max⁡{fu,0,fv,0}\max\{f_{u,0},f_{v,0}\},可保证 u,vu,v 不被同时选中.

P3572 [POI2014] PTA-Little Bird

设 fif_i 为到第 ii 棵树消耗的最小体力.

容易想到朴素转移:

fi=min⁡j=i−ki{fj+[aj≤ai]}f_i=\min_{j=i-k}^{i}\left\{f_j+\left[a_j\le a_i\right]\right\}

发现复杂度瓶颈在于求:

min⁡j=i−kifj\min_{j=i-k}^{i}f_j

用单调队列维护即可.

P2627 [USACO11OPEN] Mowing the Lawn G

设 fif_i 为在前 ii 个牛中的最大效率.

有 11 个显然的转移:

fi=max⁡j=i−ki{fj−1+∑x=jiEi}f_i=\max_{j=i-k}^i\left\{f_{j-1}+\sum_{x=j}^iE_i\right\}

显然可以前缀和优化.记 sx=∑i=1xExs_x=\sum_{i=1}^{x}E_x,有:

fi=max⁡j=i−ki{fj−1+si−sj}=max⁡j=i−ki{fj−1−sj}+fi\begin{aligned} f_i &= \max_{j=i-k}^i\left\{f_{j-1}+s_i-s_j\right\} \\ &= \max_{j=i-k}^i\left\{f_{j-1}-s_j\right\}+f_i \end{aligned}

单调队列维护 max⁡j=i−ki{fj−1−sj}\max_{j=i-k}^i\left\{f_{j-1}-s_j\right\} 即可.

P6554 Promises I Can’t Keep

观察到电流流经的路径必为当前点到 11 个叶节点的路径.

令 dud_u 表示在以 uu 为根的子树中的叶子节点的个数,VuV_u 表示 uu 的点权,CuC_u 为 uu 的儿子构成的集合.

设 fuf_{u} 表示 uu 到 uu 的子树中的所有叶节点路径上的点权和的和,gug_u 表示在 uu 到树中所有叶子节点路径上的点权和的和.

对于 fuf_u 显然有转移:

fu={Vuif u is leaf nodeduVu+∑v∈Cufvotherwisef_u= \begin{cases} V_u & \text{if }u\text{ is leaf node} \\ d_uV_u+\sum_{v\in C_u}f_v & \text{otherwise} \end{cases}

然后换根 dp 计算 gg:

∀v∈Cu,gv={gu+Vv(dr−2)−Vuif v is leaf nodegu+Vv(dr−dv)−dvVuotherwise\forall v\in C_u,g_v= \begin{cases} g_u+V_v\left(d_r-2\right)-V_u & \text{if }v\text{ is leaf node} \\ g_u+V_v\left(d_r-d_v\right)-d_vV_u & \text{otherwise} \end{cases}

其中 rr 为随意选取且不为叶节点的根节点.

答案即为:

max⁡i=1n{gidi−[i is leaf node]}\max_{i=1}^n\left\{\frac{g_i}{d_i-\left[i\text{ is leaf node}\right]}\right\}

P7961 [NOIP2021] 数列

设 fi,j,k,pf_{i,j,k,p} 表示当前讨论了 SS 的低 ii 位,已经选择了 jj 个元素,SS 低 ii 位中有 kk 个 11,当前位进位 pp.

转移时枚举 aa 中 ii 的出现次数 tt,当前状态造成贡献的状态为:

fi+1,j+t,k+(p+t) mod 2,⌊t+p2⌋f_{i+1,j+t,k+(p+t)\bmod 2,\left\lfloor\frac{t+p}{2}\right\rfloor}

考虑当前状态对下 11 个状态的贡献。对于当前未选择的 n−jn-j 位中,我们可以选择 tt 位进行填入,所以转移如下:

fi+1,j+t,k+(p+t) mod 2,⌊t+p2⌋←fi,j,k,p×vit×(n−jt)+fi+1,j+t,k+(p+t) mod 2,⌊t+p2⌋f_{i+1,j+t,k+(p+t)\bmod 2,\left\lfloor\frac{t+p}{2}\right\rfloor}\leftarrow f_{i,j,k,p}\times{v_i}^t\times\binom{n-j}{t}+f_{i+1,j+t,k+(p+t)\bmod 2,\left\lfloor\frac{t+p}{2}\right\rfloor}

答案即为:

∑i=0k∑j=0⌊n2⌋fm+1,n,i,j\sum_{i=0}^{k}\sum_{j=0}^{\left\lfloor\frac{n}{2}\right\rfloor}f_{m+1,n,i,j}

P2569 [SCOI2010]股票交易

设 fi,jf_{i,j} 表示第 ii 天持有 jj 股的最大收益.

然后大力分讨转移:

  1. 第 ii 天不进行操作时:

∀j∈[0,MaxP],fi,j←max⁡{fi,j,fi−1,j}\forall j\in\left[0,\mathrm{MaxP}\right],f_{i,j}\leftarrow\max\{f_{i,j},f_{i-1,j}\}

  1. 第 ii 天直接购买股票时:

∀j∈[0,ASi],fi,j←−APi×j\forall j\in\left[0,{AS}_i\right],f_{i,j}\leftarrow -{AP}_i\times j

  1. 第 ii 天买入股票时:

∀j∈[0,MaxP],fi,j←max⁡k∈[j−ASi,j){fi−W−1,k−(j−k)×APi}\forall j\in\left[0,\mathrm{MaxP}\right],f_{i,j}\leftarrow\max_{k\in\left[j-{AS}_i,j\right)}\{f_{i-W-1,k}-\left(j-k\right)\times{AP}_i\}

  1. 第 ii 天卖出股票时:

∀j∈[0,MaxP],fi,j←max⁡k∈(j,j+BSi]{fi−W−1,k−(k−j)×BPi}\forall j\in\left[0,\mathrm{MaxP}\right],f_{i,j}\leftarrow\max_{k\in\left(j,j+{BS}_i\right]}\{f_{i-W-1,k}-\left(k-j\right)\times{BP}_i\}

33,44 两种情况显然可以单调队列优化.

答案即为 fT,0f_{T,0}.

P8595 「KDOI-02」一个网的路

约定:mbx⁡\operatorname{mbx} 表示第 22 大的数,CuC_u 表示 uu 的儿子构成的集合,dud_u 为 uu 的度数.

由于每次是炸掉和 11 个点相连的所有边,所以我们先炸路再修路一定不劣.

于是我们的策略是把每个连通块内的树炸成 11 条链,再把这几条链连接起来.

显然最终连成的链中的边是 n−1n-1,那么我们在炸完后需要进行的操作 22 的个数便为 n−1−(m−x)n-1-(m-x),其中 xx 是炸掉的边数.

那么我们只需要让 x+yx+y 最小,其中 yy 为操作 11 的次数.

考虑对每个联通块随意选择 11 个点做根,进行树形 dp.

设 fu,0f_{u,0} 表示 uu 的子树已经被炸成链且 uu 被炸时最小的 xx;fu,1f_{u,1} 表示 uu 的子树已经被炸成链,uu 未被炸且 ∣Cu∣=1\left|C_u\right|=1 时的 xx;fu,2f_{u,2} 表示 uu 的子树已经被炸成链,uu 未被炸且 ∣Cu∣=2\left|C_u\right|=2 时最小的 xx.

考虑转移:

  1. 对于状态 00,转移显然:

fu,0←∑v∈Cumin⁡{fv,0−1,fv,1,fv,2}+du+1f_{u,0} \leftarrow \sum_{v \in C_u} \min\left\{f_{v,0}-1,f_{v,1},f_{v,2}\right\} + d_u + 1

  1. 对于状态 11,若想要其子树为链,其儿子中最多有 11 个点不被炸,选择使得 fv,1f_{v,1} 最小的 vv 不炸即可,当然还可以选择全部炸掉,转移如下:

fu,1←∑v∈Cufv,0−max⁡{0,max⁡v∈Cu{fv,0−fv,1}}f_{u,1} \leftarrow \sum_{v \in C_u} f_{v,0} - \max\left\{0,\max_{v\in C_u} \left\{f_{v,0}-f_{v,1}\right\}\right\}

  1. 对于状态 22,若想要其子树为链,其儿子中最多有 22 个点不被炸,那么再在 fu,1f_{u,1} 的基础上选择使得 fv,1f_{v,1} 第 22 小的 vv 不炸即可,转移如下:

fu,2←fu,1−max⁡{0,mbx⁡v∈Cu{fv,0−fv,1}}f_{u,2} \leftarrow f_{u,1} - \max\left\{0,\mathop{\operatorname{mbx}}\limits_{v\in C_u}\left\{f_{v,0}-f_{v,1}\right\}\right\}

最终以 rr 为根的联通块的答案即为 min⁡{fr,0,fr,1,fr,2}\min\left\{f_{r,0},f_{r,1},f_{r,2}\right\},最后的 xx 将所有联通块的答案求和即可.