一定一定要看数据范围!考虑极端情况!
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxl 32010
using namespace std;
int n;
int b[maxl],ans[maxl];
struct node{int x,y;} a[maxl>>1];
bool cmp(const node &a,const node &b)
{
if(a.x==b.x)
return a.y<b.y;
else
return a.x<b.x;
}
void prework()
{
memset(b,0,sizeof(b));
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y),a[i].x++,a[i].y++;
sort(a+1,a+1+n,cmp);
}
int sum(int i)
{
int s=0;
while(i)
{
s+=b[i];
i-=i&-i;
}
return s;
}
void add(int i,int x)
{
while(i<maxl)
{
b[i]+=x;
i+=i&-i;
}
}
void mainwork()
{
for(int i=1;i<=n;i++)
{
ans[sum(a[i].y)]++;
add(a[i].y,1);
}
}
void print()
{
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
}
int main()
{
while(~scanf("%d",&n))
{
prework();
mainwork();
print();
}
return 0;
}
272

被折叠的 条评论
为什么被折叠?



