個人NO。1
一開始題意理解有錯。
一星星左下邊有N顆星星,那它的等級就是N。
一開始理解必須X,Y兩個坐標都小於,後來根據樣例看了一下只要左下方即可,X,Y坐標都小於等於即可,但不包括星星本身。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int lowbit(int x)
{
return x&-x;
}
int c[32005];
int x[32005];
int n;
int ans[32005];
int visit[32005];
int a[32005];
void add(int x,int y)//後面的所有的值得更新,不包括自身
{
while(x<=32005)
{
c[x]+=y;
x+=lowbit(x);
}
}
int sum(int x)
{
int ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
memset(x,0,sizeof(x));
memset(ans,0,sizeof(ans));
int x,y;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&y);
if(visit[a[i]+1]==0)
{
add(a[i]+2,1);
visit[a[i]+1]=1;
}
else
add(a[i]+1,1);//c[i]表示比i坐標小的個數
ans[sum(a[i]+1)]++;
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
}
return 0;
}
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int lowbit(int x)
{
return x&-x;
}
int c[32005];
int x[32005];
int n;
int ans[32005];
int visit[32005];
int a[32005];
void add(int x,int y)//後面的所有的值得更新,不包括自身
{
while(x<=32005)
{
c[x]+=y;
x+=lowbit(x);
}
}
int sum(int x)
{
int ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
memset(x,0,sizeof(x));
memset(ans,0,sizeof(ans));
int x,y;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&y);
if(visit[a[i]+1]==0)
{
add(a[i]+2,1);
visit[a[i]+1]=1;
}
else
add(a[i]+1,1);//c[i]表示比i坐標小的個數
ans[sum(a[i]+1)]++;
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
}
return 0;
}