题解:P12688 [KOI 2022 Round 1] 避开

· · 题解

题意简述

给定长度为 n 的整数序列 a,一次操作可交换相邻两数。求最少交换次数,使序列中 奇数偶数 最多相邻一次。

解题思路

奇偶最多相邻一次,最终序列只能是 奇数段 + 偶数段偶数段 + 奇数段

选定一种奇偶性 p\in\set{0,1} 全部压到左端。

对于第 k 个奇偶性为 p 的元素,当前下标为 i,目标下标为 k,需要交换 i-k 次。

最终答案为 p=0p=1 两种情况的最小值。

参考代码

#include <bits/stdc++.h>
using namespace std;

using ll=long long;
const int N=1000005;
int a[N];
ll calc(int n,int p)
{
    ll res=0,k=0;
    for(int i=1;i<=n;i++)
    {
        if((a[i]&1)==p)res+=i-(++k);
    }
    return res;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    cout<<min(calc(n,0),calc(n,1))<<'\n';
    return 0;
}