思路:
如果是ixxxxx,共n个数。现在左移变为xxxxxi(即原:i i-3 i-2 i-1 -> i-3 i-2 i-1 i),改变了[i,i-1],[i,i-3]...[i,1],共减少了(i-1)个。共n个数,所以增加了(n-i)个。所以最终逆序对改变了:-(i-1)+(n-i)=n-2i+1。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int a[N], c[N], n ;
long long ans;
int lowbit(int x)
{
return x & -x;
}
void update(int x, int v)
{
for (int i = x; i <= n; i += lowbit(i))
c[i] += v;
}
int sum(int i)
{
int res = 0;
for (int j = i; j; j -= lowbit(j))
res += c[j];
return res;
}
int sum(int l, int r)
{
return sum(r) - sum(l - 1);
}
// 以上为树状数组模板
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
a[i]++;//0~n-1转化为1~n
}
// 求初始状态逆序对个数
for (int i = 1; i <= n; i++)
{
update(a[i], 1);
ans += sum(a[i] + 1, n);
}
cout<<ans<<endl;
for(int i=1;i<=n-1;i++){
ans+=n-a[i]*2+1;//左移一次,逆序对数改变-(i-1)+(n-i)
cout<<ans<<endl;
}
return 0;
}