//Accepted 292 KB 46 ms //利用线段树求逆序数 //对于每个数看前面比他大的数有多少个,更新这个数的个数 #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <cmath> #include <algorithm> using namespace std; /** * This is a documentation comment block * 如果有一天你坚持不下去了,就想想你为什么走到这儿! * @authr songt */ ; struct node { int l,r; int sum; }f[*imax_n]; int a[imax_n]; int n; void build(int t,int l,int r) { f[t].l=l; f[t].r=r; f[t].sum=; if (l==r) { return ; } ; build(*t,l,mid); build(*t+,mid+,r); } void update(int t,int l) { if (f[t].l==l && f[t].r==l) { f[t].sum++; return ; } ; *t,l); *t+,l); f[t].sum=f[*t].sum+f[*t+].sum; } int query(int t,int l,int r) { if (f[t].l==l && f[t].r==r) { return f[t].sum; } ; *t,l,r); else { *t+,l,r); *t,l,mid)+query(*t+,mid+,r); } } void slove() { build(,,n); ; int ans; ;i<n;i++) { update(,a[i]); if (a[i]==n) continue; ,a[i]+,n); sum+=t; //printf("%d ",t); } //printf("\n"); //printf("%d\n",sum); ans=sum; ;i<n;i++) { sum=sum+(n-a[i])-(a[i]-); if (sum<ans) ans=sum; } printf("%d\n",ans); } int main() { while (scanf("%d",&n)!=EOF) { ;i<n;i++) { scanf("%d",&a[i]); a[i]++; } slove(); } ; }