ABC322 A-F 题解
前言
为什么 ABC 天天出原题。
为什么 D 题这么答辩。
A
直接找。
B
模拟。
C
对于每一个节日从后往前扫到上一个节日。
D
搜索,不需要任何剪枝,直接爆搜。
时间复杂度应该是 \(O((kn^2)^3)\),其中 \(n=2m-1,k=4\),\(m\) 是地图大小,其值为 \(4\),\(k\) 是方向系数,为 \(4\)。
写起来比较麻烦,但没有技术含量。
E
五维背包,设 \(f_{i,a,b,c,d,e}\) 表示考虑前 \(i\) 个计划,当前的参数为 \((a,b,c,d,e)\) 时的最少花费,那么有:
\[f_{i-1,a,b,c,d,e}+w_i\to f_{i,P(a+A_i),P(b+B_i),P(c+C_i),P(d+D_i),P(e+E_i)}
\]
其中,\(P(x)=\min(p,x)\),\((A,B,C,D,E)\) 为第 \(i\) 个计划能增加的参数。
值得注意的是,还有一个继承转移,即:
\[f_{i,a,b,c,d,e}\gets f_{i-1,a,b,c,d,e}
\]
所求即 \(f_{n,p,p,p,p,p}\)。
小技巧:可以将计划缺少的参数统一设为 \(p\)。
F
模板题 & 原题。
用线段树维护,在每个节点维护:
-
\(sum\):区间和。
-
\(len\):区间长度。
-
\(lsum0\):从左端起最长 \(0\) 段的长度。
-
\(lsum1\):从左端起最长 \(1\) 段的长度。
-
\(rsum0\):从右段起最长 \(0\) 段的长度。
-
\(rsum1\):从右段起最长 \(1\) 段的长度。
-
\(max0\):区间内最长 \(0\) 段的长度。
-
\(max1\):区间内最长 \(1\) 段的长度。
-
\(tag\):区间翻转标记。
容易写成合并式:
\[\boxed{\begin{aligned}sum&=sum_{ls}+sum_{rs}\\
len&=len_{ls}+len_{rs}\\
max0&=\max(max0_{ls},max0_{rs},rsum0_{ls}+lsum0_{rs})\\
max1&=\max(max1_{ls},max1_{rs},rsum1_{ls}+rsum0_{rs})\\
lsum0&=\begin{cases}lsum0_{ls}&sum_{ls}\not=0\\len_{ls}+lsum0_{rs}&sum_{ls}=0\end{cases}\\
lsum1&=\begin{cases}lsum1_{ls}&sum_{ls}\not=len_{ls}\\len_{ls}+lsum1_{rs}&sum_{ls}=len_{ls}\end{cases}\\
rsum0&=\begin{cases}rsum0_{rs}&sum_{rs}\not=0\\len_{rs}+rsum0_{ls}&sum_{rs}= 0\end{cases}\\
rsum1&=\begin{cases}rsum1_{rs}&sum_{rs}\not=len_{rs}\\len_{rs}+rsum1_{ls}&sum_{rs}=len_{rs}\end{cases}\\
\end{aligned}}\]
(可能看着比较多,其实很简单)
单节点更新只需要将 \(max0,max1,lsum0,lsum1,rsum0,rsum1\) 成对交换,再更新一下区间和和 \(tag\) 就行了。

浙公网安备 33010602011771号