分析:前段时间做的,大概是先求逆序数,再根据这个O(m)推出可能的最大逆序数。
类型:单点更新, 树状数组 / 线段树
代码(树状数组):
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 5002
#define INF 1<<30
#define LOWBIT(x) x&(-x)
int c[MAXN];
int a[MAXN]; //原序
int n;
void insert(int e)
{
while(e<=n)
{
c[e]+=1;
e+=LOWBIT(e);
}
}
int sum(int e)
{
int ret=0;
while(e>0)
{
ret += c[e];
e-=LOWBIT(e);
}
return ret;
}
int solve(int rank)
{
int ans=INF;
for(int i=0; i<n; i++)
{
rank = rank-a[i]+n-a[i]-1;
ans=ans<rank?ans:rank;
}
return ans;
}
int main()
{
while(scanf("%d", &n)!=EOF)
{
memset(c, 0, sizeof(c)); //老是忘记清c[]............
int rank=0;
for(int i=0; i<n; i++)
{
int t; scanf("%d", &t); a[i] = t;
insert(t+1); //t+1 避免0下标,tle的......
rank+=i+1-sum(t+1); //加上比 t 大的数的个数
}
printf("%d\n", solve(rank));
}
}