地址:https://loj.ac/problem/10114
解析:由于坐标是按y递增排序,所以对于一个点来讲,只看之前x小于等于它的就可以了。那么对于输入的每个点,求之前x小于等于它的,就得用树状数组维护。树状数组c[i]表示x=i时,它之前x小于等于它的有几个点。个数就是级数,num[]来记录。x+1防止死循环。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int maxn=32001; int num[maxn]; int c[maxn]; int lowbit(int i) { return i&(-i); } void update(int x) { for(int i=x;i<=maxn;i+=lowbit(i)) c[i]++; } int getsum(int x) { int sum=0; for(int i=x;i>0;i-=lowbit(i)) { sum+=c[i]; } return sum; } int main() { int n; cin>>n; int x,y; for(int i=1;i<=n;i++) { cin>>x>>y; x++; num[getsum(x)]++; update(x); } for(int i=0;i<n;i++) cout<<num[i]<<endl; }