P6631 [ZJOI2020] 序列 解题报告:
题意
给定一个序列 \(a\),你每次可以选择三个操作中的一个:①区间减一②区间奇数下标减一③区间偶数下标减一。
求至少要多少次操作才能让序列变成全 \(0\)。
\(1\leqslant n\leqslant 10^5\)。
分析
搞了好多天的毒瘤题,写篇题解帮助一下我这样的萌新。
我们记操作集合为 \(S\)(注意不是三种操作,而是每个区间的每种操作都在集合内),再记 \(x_t\) 为操作 \(t\) 的使用次数,于是列出线性规划式:
\[\text{minimize }\sum_{t\in S}x_t\\
\text{s.t. }\sum_{t\ni i}x_t=a_i\\
x_t\geqslant 0
\]
改写一下:
\[\text{minimize }\sum_{t\in S}x_t\\
\text{s.t. }\sum_{t\ni i}x_t\geqslant a_i\\
-\sum_{t\ni i}x_t\geqslant -a_i\\
x_t\geqslant 0
\]
由于上面的变量太多限制太少,然后对上面的问题对偶(令 \(p_i,q_i,r_i\) 分别为二、三、四行的对偶变量)
\[\text{maximize }\sum a_i(p_i-q_i)\\
\sum_{i\in S}(p_i-q_i)+r_t=1\\
p_i,q_i,r_i\geqslant 0
\]
我们发现可以直接去掉变量 \(r_t\),同时令 \(b_i=p_i-q_i\),那么得到:
\[\text{maximize }\sum a_ib_i\\
\sum_{i\in S}b_i\leqslant 1\\
\]
那么我们就是给每个位置赋一个权值 \(b_i\),使得每一个操作的权值和不超过 \(1\)。
可以通过调整法证明 \(b_i\) 为整数,那么