题目描述:给你n个星星的二维坐标星星的等级等于它左下角的星星的数量 现在让你输出每个等级有所少个星星
1<=N<=15000,,0<=X,Y<=32000
分析:题目已经对x排好序了 如果没排自己排也一样: 然后按y每次查询y前面有多少个星星 也就是查询区间[0,y],即RMQ 因为单个操作所以首选树状数组但有几个注意点:
树状数组的范围大小事数据的范围(所以必要时要离散化)而且树状数组的范围是>0的而这个题目可以等于0所以要把全部数往后移一位;
ac代码:
#include<bits/stdc++.h> using namespace std; const int MAX=15003; int n; int sum[32006]; int lowbit(int x){ return x&(-x); } void update(int x){ while(x<=32006){ sum[x]++; x+=lowbit(x); } } int query(int x){ int ans=0; while(x){ ans+=sum[x]; x-=lowbit(x); } return ans; } int main(){ ios::sync_with_stdio(0); cin.tie(0); // freopen("1.txt","r",stdin); while(cin>>n){ memset(sum,0,sizeof sum); int ans[MAX]={0}; for(int i=0;i<n;i++){ int x,y; cin>>x>>y; ans[query(x+1)]++; update(x+1); } for(int i=0;i<n;i++){ cout<<ans[i]<<endl; } } }