思路:树状数组
代码1:cin,cout
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=32000 +100;
int n,c[maxn];
int level[maxn];
int lowbit(int i)
{
return i&-i;
}
void update(int i,int val)
{
while(i<=maxn)// 一直 更新到 树状数组 最上面的值
{
c[i]+=val;
i+=lowbit(i);
}
}
int sum(int i)
{
int sum=0;
while(i>0)
{
sum+=c[i];
i-=lowbit(i);
}
return sum;
}
int main()
{
int i;
int x,y;
while(cin>>n)
{
memset(c,0,sizeof(c));
memset(level,0,sizeof(level));
for(i=0;i<n;i++)
{
cin>>x>>y;
x++;// x 为 0的时候,会进入死循环(树状数组从 1 开始),所以都 +1
level[sum(x)]++;
update(x,1);
}
for(i=0;i<n;i++)
{
cout<<level[i]<<endl;
}
}
return 0;
}
代码2:scanf,printf
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int maxn=32000 +100;
int n,c[maxn];
int level[maxn];
int lowbit(int i)
{
return i&-i;
}
void update(int i,int val)
{
while(i<=maxn)// 一直 更新到 树状数组 最上面的值
{
c[i]+=val;
i+=lowbit(i);
}
}
int sum(int i)
{
int sum=0;
while(i>0)
{
sum+=c[i];
i-=lowbit(i);
}
return sum;
}
int main()
{
int i;
int x,y;
while(scanf("%d",&n)!=EOF)//<span style="color:#009900;">此处需要加上 !=EOF </span>
{
memset(c,0,sizeof(c));
memset(level,0,sizeof(level));
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x++;// x 为 0的时候,会进入<span style="color:#009900;">死循环</span>(树状数组从 1 开始),所以都 +1
level[sum(x)]++;
update(x,1);
}
for(i=0;i<n;i++)
{
printf("%d\n",level[i]);
}
}
return 0;
}