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) 表示 uuvv 之间的距离.

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

容易得出 ff 的转移:

fu,k=vCufv,kw(u,v)mod3f_{u,k}=\sum_{v\in C_u}f_{v,k-\operatorname{w}\left(u,v\right)\bmod3}

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

gu,k=fu,k+gFu,kw(Fu,u)mod3fu,k2w(Fu,u)mod3g_{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}

答案即为:

1n2i=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),图中从 11uu 的最短路长为 dud_u

fu,kf_{u,k} 表示从 11uu 长度为 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=dudv+kw(u,v)x=d_u-d_v+k-\operatorname{w}(u,v)

那么我们有转移:

fu,k=(u,v)Efv,dudv+kw(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=aiai1b_i=a_i\oplus a_{i-1}

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

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

ai=alk=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=rr=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=maxvCu{maxj=0sv{fu,ij+fv,j+w(u,v)×j(kj)+w(u,v)×(nk+jsv)(svj)}}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,ciji,j,c-i-j 的三角形.

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

fj,k=fjai,kfj,kaif_{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+aibi=min{fi,j+aibi,fi1,j}fi,j+biai=min{fi,j+biai,fi1,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,xf_{n,x}\not=\inftymin{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,0min{fi1,j,0+wci1,ci,fi1,j,1+ki1wdi1,ci+(1ki1)wci1,ci}fi,j,1min{fi1,j1,0+kiwci1,di+(1ki)wci1,ci,fi1,j1,1+ki1kiwdi1,di+(1ki1)kiwci1,di+ki1(1ki)wdi1,ci+(1ki1)(1ki)wci1,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}

答案即为:

mini=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,jmaxk=jd(titi1)j+d(titi1){fi1,k+biaik}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\}

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

考虑优化转移过程.

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

maxk=jd(titi1)j+d(titi1)fi1,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(nmlogn)O\left(nm\log n\right) 仍然会 TLE.

发现每次转移求最值的区间固定为 [jd(titi1),j+d(titi1)][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

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

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

CF1689C Infected Tree

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

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

被感染的节点的数量为 dd

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

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

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

CF1689D Lena and Matrix

考虑 Manhattan 距离转 Chebyshev 距离.

对点 A(x0,y0)A\left(x_0,y_0\right) 进行变换得到点 A(x0+y0,x0y0)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} 点的集合为 WWB\texttt{B} 点的集合为 BB

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

maxQBxF(Q),minQBxF(Q)maxQByF(Q),minQByF(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=minj=iki{fj+[ajai]}f_i=\min_{j=i-k}^{i}\left\{f_j+\left[a_j\le a_i\right]\right\}

发现复杂度瓶颈在于求:

minj=ikifj\min_{j=i-k}^{i}f_j

用单调队列维护即可.

P2627 [USACO11OPEN] Mowing the Lawn G

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

11 个显然的转移:

fi=maxj=iki{fj1+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=maxj=iki{fj1+sisj}=maxj=iki{fj1sj}+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}

单调队列维护 maxj=iki{fj1sj}\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_uuu 的儿子构成的集合.

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

对于 fuf_u 显然有转移:

fu={Vuif u is leaf nodeduVu+vCufvotherwisef_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

vCu,gv={gu+Vv(dr2)Vuif v is leaf nodegu+Vv(drdv)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 为随意选取且不为叶节点的根节点.

答案即为:

maxi=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 个元素,SSii 位中有 kk11,当前位进位 pp

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

fi+1,j+t,k+(p+t)mod2,t+p2f_{i+1,j+t,k+(p+t)\bmod 2,\left\lfloor\frac{t+p}{2}\right\rfloor}

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

fi+1,j+t,k+(p+t)mod2,t+p2fi,j,k,p×vit×(njt)+fi+1,j+t,k+(p+t)mod2,t+p2f_{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=0kj=0n2fm+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,jmax{fi,j,fi1,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,jAPi×j\forall j\in\left[0,{AS}_i\right],f_{i,j}\leftarrow -{AP}_i\times j

  1. ii 天买入股票时:

j[0,MaxP],fi,jmaxk[jASi,j){fiW1,k(jk)×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,jmaxk(j,j+BSi]{fiW1,k(kj)×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\}

3344 两种情况显然可以单调队列优化.

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

P8595 「KDOI-02」一个网的路

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

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

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

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

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

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

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

考虑转移:

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

fu,0vCumin{fv,01,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,1vCufv,0max{0,maxvCu{fv,0fv,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,2fu,1max{0,mbxvCu{fv,0fv,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 将所有联通块的答案求和即可.