题解:仔细想下,这题的y没有用,有用的只是x,x出现一次就加一次(这里是x+1,因为x可能等于0),之后再把0到x的全部值加一遍,得出的tem用ans数组记录下来,最后输出即可。
AC代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAX_N=15005; const int MAX_B=15005<<2;//范围尽量开大 4倍 也就是和线段树一样 int bit[MAX_B],n; int ans[MAX_N]; int sum(int i)//相加是减到最根节点 { int s=0; while(i>0) { s+=bit[i]; i-=i&-i; } return s; } void add(int i,int x)//修改是不断向父节点延伸 { while(i<=MAX_B)/**< 最重要的就是这!! 这是i<=MAXB 而不是n!! */ { bit[i]+=x; i+=i&-i; } } int main() { while(scanf("%d",&n)!=EOF)///输入全用scan = =用cin的我超了好几次时 { memset(ans,0,sizeof(ans)); memset(bit,0,sizeof(bit)); int x,y; for (int i=1;i<=n;i++) { scanf("%d%d",&x,&y); int tem=sum(x+1); ans[tem]++; add(x+1,1); } for (int i=0;i<n;i++) { printf("%d ",ans[i]); } } return 0; }