可以发现第一次reverse后,只会存在一些长度为2的递减序列,其实就是逆序对的数量了。
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[100005],tree[100005];
long long ans;
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
inline int lowbit(int i)
{
return (i&(-i));
}
inline void add(int x,int val)
{
for (int i=x;i<=n;i+=lowbit(i)) tree[i]+=val;
}
inline int query(int x)
{
int tmp=0;
for (int i=x;i;i-=lowbit(i)) tmp+=tree[i];
return tmp;
}
inline void reverse()
{
int last=1;
for (int i=2;i<=n;i++)
if (a[i]>a[i-1])
{
ans++;
for (int j=last;j<=(i-1+last>>1);j++)
swap(a[j],a[i-1-j+last]);
last=i;
}
if (last<n)
{
ans++;
for (int j=last;j<=(last+n>>1);j++) swap(a[j],a[n-j+last]);
}
}
int main()
{
n=read();
for (int i=1;i<=n;i++) a[i]=read();
reverse();
for (int i=n;i;i--)
{
ans+=query(a[i]);
add(a[i],1);
}
cout << ans << endl;
return 0;
}