树状数组求逆序数
按照题目输入的顺序,只需要找出(1,x)有几个点即可,然后更新。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=32005;
int a[maxn];
int Lowbit(int x)
{
return x&(-x);
}
void update(int x,int val)
{
for(int i=x;i<maxn;i+=Lowbit(i))
a[i]+=val;
}
long long query(int x)
{
long long ans=0;
for(int i=x;i>0;i-=Lowbit(i))
ans+=a[i];
return ans;
}
int ans[maxn];
int main()
{
int n,x,y;
scanf("%d",&n);
memset(ans,0,sizeof(ans));
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
scanf("%d%d",&x,&y);
x++;
ans[query(x)]++;
update(x,1);
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
}