题目分析:一个数组中,求某个元素左边小于等于它的数的个数,记为level, ans[level]++,按level 从0到输出他们出现次数,
代码:
#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
const int MAX=100000;
int ans[MAX],tree[MAX],n;
int LowBit(int x)
{
return x&(-x);
}
int GetSum(int x)
{
int temp=0;
for(int i=x;i>=1;i-=LowBit(i))
temp+=tree[i];
return temp;
}
void UpDate(int x,int c)
{
for(int i=x;i<=MAX;i+=LowBit(i))
tree[i]+=c;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int x,y;
memset(tree,0,sizeof(tree));
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
{
scanf("%d %d",&x,&y);
ans[GetSum(x+1)]++;//因为0<=x<=32000,注意x==0,否则死循环
UpDate(x+1,1);
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
}
system("pause");
return 0;
}