怎么都不是这么做的???
先考虑计算
f(a1,a2,⋯,an)。
考虑一次折叠相当于将编号为
p1<p2<⋯<pk 的格子减一,然后要求
pi 和
pi−1 奇偶性不同。
考虑构建一张二分图,其中左部点表示入度,右部点表示出度。入度
i 能和出度
j 匹配,当且仅当
j<i,且
i,j 奇偶性不同。
那么最少操作次数,就等价于
∑i=1nai−maxmatch。
计算
maxmatch 考虑 Hall 定理,对于权值,我们可以等效看成多个点,令
L 表示左部点集合,
N(S) 表示
S 集合出边的并集。由于
maxmatch=∣L∣−maxS⊆L{∣S∣−∣N(S)∣},所以最少操作次数为
maxS⊆L{∣S∣−∣N(S)∣}。
对于
N(S),我们发现我们只关心
S 集合中的编号最大值
mx1,以及编号和
mx1 奇偶性不同的编号最大值
mx2。我们发现,
mx2 前面的位置选,不会对
N(S) 造成影响,同时
(mx2,mx1] 之间和
mx1 奇偶性相同的位置,也不会对
N(S) 产生影响。于是,为了使得
∣S∣ 尽量大,我们会将这些点全选。
我们发现此时
S 为
{i∣i≤mx2}∪{i∣i∈[mx2,mx1]∧i≡mx1(mod2)},
N(S) 为
{i∣i≤mx2}∪{i∣i∈(mx2,mx1]∧i≡mx1(mod2)}。
那么
∣N(S)∣−∣S∣ 就为:
maxmx1>mx2∧mx1≡mx2(mod2)}{∑i∈(mx2,mx1]∧i≡mx1(mod2)ai−∑i∈(mx2,mx1]∧i≡mx1(mod2)ai}
就得到了这个重要结论。
我们考虑令
si 为前
i 个数,奇数位置减去偶数位置的差。
那么我们惊讶的发现,求的东西就可以等效成
maxi=l−1r{si}−mini=l−1r{si}。
于是拆成两部分,单调栈维护了。