直接贴代码:关键代码都写了注释
//以后可能会继续写用线段树或者归并排序处理,线段树处理代码最简洁了。O(n^2)的代码就不说了
树状数组维护:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int n;
int a[maxn],c[maxn];
int ans;
int lowbit(int x)
{
return x&(-x);
}
void add(int i,int k)
{
while(i<=n)//如需修改这个模板,注意修改这个n
{
c[i]+=k;
i+=lowbit(i);
}
}
int getsum(int i)//[1,i]的和
{
int res=0;
while(i>0)
{
res+=c[i];
i-=lowbit(i);
}
return res;
}
int main()
{
while(cin>>n)
{
ans=0;
memset(c,0,sizeof c);
//可以加入离散化
for(int i=1; i<=n; i++)
{
cin>>a[i];
add(a[i],1);//在ai的位置+1,相当于统计个数
ans+=(i-getsum(a[i]));
//下面这句更好理解,和上面是等价的
// ans+=(getsum(n)-getsum(a[i]));
}
cout<<ans<<endl;
}
return 0;
}
/*
test
5
2 3 4 1 5
5
5 4 3 2 1
3
3 2 1
*/