题意:直角坐标系上有n个点 每个点的值为它左下的点的数量
求0。。。n-1每个数值出现的次数
思路:题目中已经给出y递增 x在y相同时递增
从而可以一边输入一边利用树状数组将结果求出
每次输入时 先计算出 sum(x+1) (由于树状数组下标从1 开始 ,所以每个值都加1,否则会超时)
再 add(x)
最后统计结果
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int c[50000],num[50000]; int N=32100; int lowbit(int x) { return x&(-x); } int sum(int x) { int ret=0; while(x>0) { ret+=c[x]; x-=lowbit(x); } return ret; } void add(int x,int d) { while(x<=N) { c[x]+=d; x+=lowbit(x); } } int main() { int t; int i,j; while(cin>>t) { memset(c,0,sizeof(c)); memset(num,0,sizeof(num)); for(i=0;i<t;i++) { int x,y; scanf("%d%d",&x,&y); num[sum(x+1)]++; add(x+1,1); } for(i=0;i<t;i++) { printf("%d ",num[i]); } } return 0; }