题目大意:
按照如果Y值相等X从小到大,如果Y值不相等Y值从小到大的顺序给出一些点。不会有两点在相同的位置。当原点(0,0)到这个点为对角线的矩形内有n个点时,这个点为等级n的点。输出每个等级的点有多少个。
解题思路:
很水的单点更新线段树。这个题离散化可以不离散化也行。如果不离散化注意点的范围。
下面是代码:
#include <stdio.h>
#include <string.h>
const int Max=32205;
int node[Max<<2],ans[Max];
int query(int L ,int R ,int l ,int r ,int tr)
{
if(L<=l&&r<=R)
{
return node[tr];
}
int m=(l+r)>>1,ans=0;
if(L<=m)ans+=query(L,R,l,m,tr<<1);
if(m<R)ans+=query(L,R,m+1,r,tr<<1|1);
return ans;
}
void PushUp(int tr)
{
node[tr]=node[tr<<1]+node[tr<<1|1];
}
void update(int p,int l,int r,int tr)
{
if(l==r)
{
node[tr]++;
return;
}
int m=(l+r)>>1;
if(p<=m)update(p,l,m,tr<<1);
else update(p,m+1,r,tr<<1|1);
PushUp(tr);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(node,0,sizeof(node));
memset(ans,0,sizeof(ans));
int a,b;
for(int i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
ans[query(0,a,0,32000,1)]++;
update(a,0,32000,1);
}
for(int i=0;i<n;i++)
{
printf("%d\n",ans[i]);
}
}
return 0;
}