P6631 [ZJOI2020] 序列 解题报告


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\) 为整数,那么

代码