CF2129B Stay or Mirror 题解
https://codeforces.com/problemset/problem/2129/B
首先不用太在意t的大小,你还是看n的量级就行了。5000就是可以o(n2)的。而在可以动态调整操作的问题里你要找那些不会随你操作改变的东西。这里面就是对于任意满足 j>i,pj>pi,无论 aj是否翻转,操作后都满足 ai>aj,即构成逆序对。对于任意满足 j<i,pj>pi,无论 pj是否翻转,操作后都满足 aj>ai,即构成逆序对。当 i 取翻转值的时候,我们记 i 的贡献为在 i 右侧的所有原值大于 pi的数的数量,当 i 取原值的时候,我们记 i 的贡献为在 i 左侧的所有原值大于 pi的数的数量。而经过验算我们发现这是全覆盖的。所以转换看右边,不转看左边。要大胆猜测!是否就是答案。
#include<bits/stdc++.h>
using namespace std;
const int N=10000;
int T;
int n;
int p[N];
long long ans=0;
int a[N],b[N];
int main()
{
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i];
}
memset(a,0,sizeof a);
memset(b,0,sizeof b);
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(p[j]>p[i])
{
a[i]++;
}
}
for(int j=i+1;j<=n;j++)
{
if(p[j]>p[i])
{
b[i]++;
}
}
}
long long ans=0;
for(int i=1;i<=n;i++)
{
ans+=min(a[i],b[i]);
}
cout<<ans<<endl;
}
return 0;
}

浙公网安备 33010602011771号