1265. 数星星
题目链接https://www.acwing.com/problem/content/1267/
题目:
#include<iostream>
#include<cstdio>
using namespace std;
const int N=32010;
int tre[N<<2];
int ct[N];
void pushup(int u){
tre[u]=tre[u<<1]+tre[u<<1|1];
}
void update(int u,int l,int r,int x){
if(l==r){
tre[u]++;
return ;
}
int mid=l+r>>1;
if(x<=mid) update(u<<1,l,mid,x);
if(x>mid) update(u<<1|1,mid+1,r,x);
pushup(u);
}
int query(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
return tre[u];
}
int mid=l+r>>1;
int sum=0;
if(L<=mid) sum+=query(u<<1,l,mid,L,R);
if(R>mid) sum+=query(u<<1|1,mid+1,r,L,R);
return sum;
}
int main(){
int n;
cin>>n;
int x,y;
for(int i=0;i<n;i++){
scanf("%d%d",&x,&y);
ct[query(1,0,N,0,x)]++;
update(1,0,N,x);
}
for(int i=0;i<n;i++){
printf("%d\n",ct[i]);
}
return 0;
}