时间限制: 1 s
空间限制: 32000 KB
题目等级 : 黄金 Gold
题目描述 Description
Smart和Sarah正在玩一个即时战略游戏。
Smart在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限,但是,战壕有一个弱点:就是只能攻击它的左下方,说白了就是横、纵坐标都不大于它的点。这样,Sarah就可以从别的地方进攻摧毁战壕,从而消灭Smart的部队。
战壕都有一个保护范围,同它的攻击范围一样,它可以保护处在它左下方的战壕。所有处于它保护范围的战壕都叫做它的保护对象。这样,Sarah就必须找到Smart的战壕中保护对象最多的战壕,从而优先消灭它。
现在,由于Sarah没有时间来计算,所以拜托你来完成这个任务:给出这n个战壕的坐标(xi、yi),要你求出保护对象个数为0,1,2……n-1的战壕的个数。
输入描述 Input Description
第一行,一个正整数n(1≤n≤5000)
接下来n行,每行两个数xi,yi,代表第i个点的坐标(1≤xi,yi≤32767)注意:可能包含多重战壕的情况(即有数个点在同一坐标)。
输出描述 Output Description
输出n行,分别代表保护对象有0,1,2……n-1个的战壕个数。
样例输入 Sample Input
5
1 1
5 1
7 1
3 3
5 5
样例输出 Sample Output
1
2
1
1
0
数据范围及提示 Data Size & Hint
时间限制
1s
树状数组
#include <algorithm> #include <cstdio> #define N 50005 struct node { int x,y; bool operator<(node a)const { if(x!=a.x) return x<a.x; else return y<a.y; } }zh[N]; using namespace std; int n,tag[N],ans[N]; inline int lowbit(int x) {return x&(-x);} inline int ask(int x) { int ret=0; for(;x;x-=lowbit(x)) ret+=tag[x]; return ret; } void modify(int x,int y) { for(;x<=32767;x+=lowbit(x)) tag[x]+=y; } int main(int argc,char *argv[]) { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d%d",&zh[i].x,&zh[i].y); sort(zh+1,zh+1+n); for(int i=1;i<=n;++i) { ans[ask(zh[i].y)]++; modify(zh[i].y,1); } for(int i=0;i<n;++i) printf("%d ",ans[i]); return 0; }