题解:P13754 【MX-X17-T3】Distraction

· · 题解

很好的思维题。

主要思路

我们只关心 \sum_{j=1}^{i-1}[p_j>p_i]+\sum_{j=i+1}^{n}[p_i>p_j] \pmod2 的值。考虑对上式进行变形。

=\sum_{j=1}^{i-1}(1-[p_i>p_j])+\sum_{j=i+1}^{n}[p_i>p_j]\\& =(i-1)-\sum_{j=1}^{i-1}[p_i>p_j]+\sum_{j=i+1}^{n}[p_i>p_j]\\& \equiv(i-1)+\sum_{j=1}^{i-1}[p_i>p_j]+\sum_{j=i+1}^{n}[p_i>p_j]\\& =(i-1)+\sum_{j=1}^{n}[p_i>p_j]\\& =(i-1)+(p_i-1)\equiv i+p_i\pmod2 \end{aligned}

这就得到了 v_i 的简单表达式,有 v_i 只与 ip_i 的奇偶性有关,且有

\sum_{i=1}^{n}v_i\equiv\sum_{i=1}^n(i+p_i)=2\sum_{i=1}^ni\equiv0\pmod 2

考虑对排列执行一次操作后,v_i 的值如何变化。

p_j 被插入到位置 k(此处考虑 j<k 的情形,j>k 的情形类似),则

$$v:(v_1,\cdots,v_n)\rightarrow(v_1',\cdots,v_n')$$,其中 $$v_i'\equiv p_i'+i=\begin{cases}p_{i+1}+i&j\le i\le k-1\\p_j+i&i=k\\p_i+i&else\end{cases}\equiv\begin{cases}1-v_{i+1}&j\le i\le k-1\\v_j+k-j&i=k\\v_i&else\end{cases}\pmod2

v' 元素大致为将 vjk 位进行取反(0 变成 11 变成 0)。

故为使权值增加尽可能多,(贪心)选择 v 的区间使得区间内 0 的个数与 1 的个数之差尽可能大,取该区间的前一元素插入区间最后即可。

简单计算可知若区间内 0,1 个数差为 d,则权值增加量为 2\lfloor\frac{d}{2}\rfloor。分类讨论易证 2\lfloor\frac{d}{2}\rfloor 最优。

CODE

#include <bits/stdc++.h>
using namespace std;
const int INF=1e9+9;
int T,n,p,cnt[5000009],mn[5000009],mx,ans;
int main(){
    cin>>T;
    while(T--){
        scanf("%d",&n); cnt[0]=mn[0]=mx=ans=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&p);
            if((i+p)%2==0) cnt[i]=cnt[i-1]+1;
            else cnt[i]=cnt[i-1]-1,ans++;
        }
        for(int i=1;i<=n;i++) mn[i]=min(mn[i-1],cnt[i]);
        for(int i=1;i<=n;i++) mx=max(mx,cnt[i]-mn[i-1]); //求最大连续字段和
        ans+=mx/2*2; printf("%d\n",ans);
    }
    return 0;
}

(LATEX 新手,dalao 轻喷,求点赞支持 qwq