数星星
#include<iostream> using namespace std; const int N=100010; int a[N],tr[N]; int lowbit(int x) { return x&-x; } void add(int x) { for(int i=x;i<=N;i+=lowbit(i))tr[i]++;//值得注意的是,树状数组的更新一定要更新到N } int query(int x) { int res=0; for(int i=x;i;i-=lowbit(i)) { res+=tr[i]; } return res; } int main() { int t; cin>>t; for(int i=1;i<=t;i++) { int x,y; cin>>x>>y; x++;//x的最小值是0,而树状数组的最小下标为1,所以整体往后移一个。 add(x); a[query(x)]++; } for(int i=1;i<=t;i++) { cout<<a[i]<<endl; } return 0; }
这题的主要考查的是树状数组的应用,因为坐标是按 y 坐标增序给出,y 坐标相同的按 x 坐标增序给出。
所以只要求当前给出的坐标中所有横坐标小于等于该坐标的个数,自然能够想到使用前缀和,因为y坐标
是递增的,当前y坐标一定是最大的,所以求当前x的前缀和即可。