钦定根为 1.
令 Cu 表示 u 的儿子构成的集合,Fu 表示节点 u 的父亲,w(u,v) 表示 (u,v) 这条边的权值,d(u,v) 表示 u,v 之间的距离.
设 fu,k 表示在 u 的子树中满足 d(u,v)mod3=k 的 v 的个数,gu,k 表示在树中满足 d(u,v)mod3=k 的 v 的个数.
容易得出 f 的转移:
fu,k=v∈Cu∑fv,k−w(u,v)mod3
我们由换根 dp 套路可以得到 g 的转移:
gu,k=fu,k+gFu,k−w(Fu,u)mod3−fu,k−2w(Fu,u)mod3
答案即为:
n21i=1∑ngi,0
令原图为 G(V,E),(u,v)∈E 的权值为 w(u,v),图中从 1 到 u 的最短路长为 du.
设 fu,k 表示从 1 到 u 长度为 du+k 的路径条数.
考虑转移.假设 fu,k 可由 fv,x 转移而来.我们有下式:
dv+w(u,v)+x=du+k
解得 x=du−dv+k−w(u,v).
那么我们有转移:
fu,k=(u,v)∈E∑fv,du−dv+k−w(u,v)
答案即为:
i=0∑kfn,i
考虑向量序列 α1,α2,⋯,αn,其中 αi=(ai,bi,ci,1).
考虑修改操作.发现所有修改操作都可以通过矩阵乘法的形式来表示,具体如下:
- ai=ai+bi,修改时乘上的矩阵如下:
⎝⎜⎜⎜⎛1100010000100001⎠⎟⎟⎟⎞
- bi=bi+ci,修改时乘上的矩阵如下:
⎝⎜⎜⎜⎛1000011000100001⎠⎟⎟⎟⎞
- ci=ci+ai,修改时乘上的矩阵如下:
⎝⎜⎜⎜⎛1000010010100001⎠⎟⎟⎟⎞
- ai=ai+v,修改时乘上的矩阵如下:
⎝⎜⎜⎜⎛100v010000100001⎠⎟⎟⎟⎞
- bi=vbi,修改时乘上的矩阵如下:
⎝⎜⎜⎜⎛10000v0000100001⎠⎟⎟⎟⎞
- ci=v,修改时乘上的矩阵如下:
⎝⎜⎜⎜⎛10000100000v0001⎠⎟⎟⎟⎞
把我们的向量序列丢到线段树上,只需要提供区间和查询和区间乘修改即可.
不知道为什么大家都在说卡常,我没卡常也能过.
令 ⊕ 代表按位 xor 运算.
记原序列为 a.
设序列 b,其中 bi=ai⊕ai−1.
可以发现这样的序列 b 具有和差分数组类似的性质,这样我们的区间修改就变成了单点修改.
对于每次查询的区间 [l,r],我们可以发现对于 i∈[l,r],我们有:
ai=al⊕k=l+1⨁ibk
也就是说 al,al+1,⋯,ar 可被 al,bl+1,bl+2,⋯,br 表出,所以二者的基等价.
那么我们直接在线段树上维护 b 的线性基,查询时取出 bl+1,bl+2,⋯,br 的线性基,然后插入 al 进行查询即可.
注意对 l=r 和 r=n 的判定.
看到题目容易想到设 fu,i 为 u 子树中选择 i 个节点染成黑色时的最大受益.但是这样没法转移,所以寄.
考虑每条边的边权对答案的贡献,容易得到对于每种颜色的节点,1 条边对答案的贡献即为其两侧同为这种颜色的节点数的乘积.
令 su 表示以 u 为根的子树的大小,Cu 表示 u 的儿子构成的集合,w(u,v) 为树上 (u,v) 这条边的权值.
设 fu,i 表示在 u 的子树中选择 i 个节点染成黑色时对答案的贡献,我们可以得到转移:
fu,i=v∈Cumax{j=0maxsv{fu,i−j+fv,j+w(u,v)×j(k−j)+w(u,v)×(n−k+j−sv)(sv−j)}}
树形背包转移即可.
发现三角形的周长一定.设为 c.
设 fi,j 表示是否存在边长为 i,j,c−i−j 的三角形.
设 i 为当前考虑到前 i 位,容易得到转移:
fj,k=fj−ai,k∨fj,k−ai
转移时注意负下标.
最后枚举可行方案,Heron 公式计算面积即可.
比题解第 1 篇的效率高不少.
注意到数据范围允许我们枚举差值.
设 fi,j 表示考虑前 i 个骨牌,差值为 j 的最小旋转次数.
显然有 fx,y=∞,f0,0=0.
枚举差值 j,我们有转移:
fi,j+ai−bifi,j+bi−ai=min{fi,j+ai−bi,fi−1,j}=min{fi,j+bi−ai,fi−1,j+1}
转移后找到绝对值最小的 x 使得 fn,x=∞,min{fn,x,fn,−x} 即为答案.
记图中 u,v 两点间的最短路距离为 wu,v,显然可以用 Floyd 预处理.
设 fi,j,0 为考虑了前 i 个时间段,已经申请了 j 次换教室,且本次不申请的消耗的体力值总和的期望的最小值;fi,j,1 为本次申请的.
显然有 f1,0,0=0,f1,1,1=0.
考虑转移:
fi,j,0←min{fi,j,1←min{fi−1,j,0+wci−1,ci,fi−1,j,1+ki−1wdi−1,ci+(1−ki−1)wci−1,ci}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}
答案即为:
i=0minm{fn,i,0,fn,i,1}
先考虑朴素 dp.
设 fi,j 表示放第 i 个烟火的时候在第 j 个区间的最大开心值.
不难想到转移:
fi,j←k=j−d(ti−ti−1)maxj+d(ti−ti−1){fi−1,k+bi−∣ai−k∣}
然而注意到 n≤1.5×105,m≤300,朴素 O(n2m) 的转移会 TLE.
考虑优化转移过程.
首先显然可以滚掉 1 维,然后不难发现转移瓶颈在求:
k=j−d(ti−ti−1)maxj+d(ti−ti−1)fi−1,k
所以我们直接套上线段树,维护滚掉 1 维之后的 f 即可.
然而 O(nmlogn) 仍然会 TLE.
发现每次转移求最值的区间固定为 [j−d(ti−ti−1),j+d(ti−ti−1)],可以想到单调队列.
时间复杂度为 O(nm),可以通过本题.
首先基于模拟退火的随机化可以拿到优秀的 88 分.
首先可以先把每个点和其直接相连的点压到一个 uint64_t
里,操作相当于给当前状态异或上该点的状态.
显然对每个点进行的操作次数不会超过 1.
观察到 n≤35,朴素 O(2n) 暴力会 TLE.
考虑 meet in the middle,分前后两块分别暴力,合并直接取 min 即可.
容易发现病毒感染会在叶子节点和只有 1 个儿子的节点停止,且途经从根到该节点的链上所有节点.
记最后被感染的点的深度为 d.
被感染的节点的数量为 d.
当在叶子节点处停止时,删除的点的数量为 d−1.
当在只有 1 个儿子的节点处停止时,删除的点的数量为 d.
从根开始搜索,遇到满足条件的点记录并更新答案即可.
考虑 Manhattan 距离转 Chebyshev 距离.
对点 A(x0,y0) 进行变换得到点 A′(x0+y0,x0−y0),记该变换为 F(A).变换后 2 点之间的 Chebyshev 距离即为原来的 Manhattan 距离.
记 W 点的集合为 W,B 点的集合为 B.
对于点 P∈W,能对 P 点的答案造成贡献的只有以下 4 个值:
Q∈BmaxxF(Q),Q∈BminxF(Q)Q∈BmaxyF(Q),Q∈BminyF(Q)
遍历每个点,答案取 min 即可.
基环树上的 没有上司的舞会.
随意在环上选择一条边断掉,设这条边所连接的 2 个点为 u,v.
分别以 u,v 作为根进行树形 dp,状态和转移与没有上司的舞会相同.
答案取 max{fu,0,fv,0},可保证 u,v 不被同时选中.
设 fi 为到第 i 棵树消耗的最小体力.
容易想到朴素转移:
fi=j=i−kmini{fj+[aj≤ai]}
发现复杂度瓶颈在于求:
j=i−kminifj
用单调队列维护即可.
设 fi 为在前 i 个牛中的最大效率.
有 1 个显然的转移:
fi=j=i−kmaxi{fj−1+x=j∑iEi}
显然可以前缀和优化.记 sx=∑i=1xEx,有:
fi=j=i−kmaxi{fj−1+si−sj}=j=i−kmaxi{fj−1−sj}+fi
单调队列维护 maxj=i−ki{fj−1−sj} 即可.
观察到电流流经的路径必为当前点到 1 个叶节点的路径.
令 du 表示在以 u 为根的子树中的叶子节点的个数,Vu 表示 u 的点权,Cu 为 u 的儿子构成的集合.
设 fu 表示 u 到 u 的子树中的所有叶节点路径上的点权和的和,gu 表示在 u 到树中所有叶子节点路径上的点权和的和.
对于 fu 显然有转移:
fu={VuduVu+∑v∈Cufvif u is leaf nodeotherwise
然后换根 dp 计算 g:
∀v∈Cu,gv={gu+Vv(dr−2)−Vugu+Vv(dr−dv)−dvVuif v is leaf nodeotherwise
其中 r 为随意选取且不为叶节点的根节点.
答案即为:
i=1maxn{di−[i is leaf node]gi}
设 fi,j,k,p 表示当前讨论了 S 的低 i 位,已经选择了 j 个元素,S 低 i 位中有 k 个 1,当前位进位 p.
转移时枚举 a 中 i 的出现次数 t,当前状态造成贡献的状态为:
fi+1,j+t,k+(p+t)mod2,⌊2t+p⌋
考虑当前状态对下 1 个状态的贡献。对于当前未选择的 n−j 位中,我们可以选择 t 位进行填入,所以转移如下:
fi+1,j+t,k+(p+t)mod2,⌊2t+p⌋←fi,j,k,p×vit×(tn−j)+fi+1,j+t,k+(p+t)mod2,⌊2t+p⌋
答案即为:
i=0∑kj=0∑⌊2n⌋fm+1,n,i,j
设 fi,j 表示第 i 天持有 j 股的最大收益.
然后大力分讨转移:
- 第 i 天不进行操作时:
∀j∈[0,MaxP],fi,j←max{fi,j,fi−1,j}
- 第 i 天直接购买股票时:
∀j∈[0,ASi],fi,j←−APi×j
- 第 i 天买入股票时:
∀j∈[0,MaxP],fi,j←k∈[j−ASi,j)max{fi−W−1,k−(j−k)×APi}
- 第 i 天卖出股票时:
∀j∈[0,MaxP],fi,j←k∈(j,j+BSi]max{fi−W−1,k−(k−j)×BPi}
3,4 两种情况显然可以单调队列优化.
答案即为 fT,0.
约定:mbx 表示第 2 大的数,Cu 表示 u 的儿子构成的集合,du 为 u 的度数.
由于每次是炸掉和 1 个点相连的所有边,所以我们先炸路再修路一定不劣.
于是我们的策略是把每个连通块内的树炸成 1 条链,再把这几条链连接起来.
显然最终连成的链中的边是 n−1,那么我们在炸完后需要进行的操作 2 的个数便为 n−1−(m−x),其中 x 是炸掉的边数.
那么我们只需要让 x+y 最小,其中 y 为操作 1 的次数.
考虑对每个联通块随意选择 1 个点做根,进行树形 dp.
设 fu,0 表示 u 的子树已经被炸成链且 u 被炸时最小的 x;fu,1 表示 u 的子树已经被炸成链,u 未被炸且 ∣Cu∣=1 时的 x;fu,2 表示 u 的子树已经被炸成链,u 未被炸且 ∣Cu∣=2 时最小的 x.
考虑转移:
- 对于状态 0,转移显然:
fu,0←v∈Cu∑min{fv,0−1,fv,1,fv,2}+du+1
- 对于状态 1,若想要其子树为链,其儿子中最多有 1 个点不被炸,选择使得 fv,1 最小的 v 不炸即可,当然还可以选择全部炸掉,转移如下:
fu,1←v∈Cu∑fv,0−max{0,v∈Cumax{fv,0−fv,1}}
- 对于状态 2,若想要其子树为链,其儿子中最多有 2 个点不被炸,那么再在 fu,1 的基础上选择使得 fv,1 第 2 小的 v 不炸即可,转移如下:
fu,2←fu,1−max{0,v∈Cumbx{fv,0−fv,1}}
最终以 r 为根的联通块的答案即为 min{fr,0,fr,1,fr,2},最后的 x 将所有联通块的答案求和即可.