Description
永恆和mx正在玩一個即時戰略遊戲,名字嘛~~~~~~恕本人記性不好,忘了-_-b。 mx在他的基地附近建立了n個戰壕,每個戰壕都是一個獨立的作戰單位,射程可以達到無限(“mx不贏定了?!?”永恆ftING...@_@)。 但是,戰壕有一個弱點,就是隻能攻擊它的左下方,說白了就是橫縱座標x、y有一個小於它的點(mx:“我的戰壕爲什麼這麼菜”ToT)。這樣,永恆就可以從別的地方進攻摧毀戰壕,從而消滅mx的部隊。 戰壕都有一個保護範圍,同它的攻擊範圍一樣,它可以保護處在它左下方的戰壕。所有處於它保護範圍的戰壕都叫做它的保護對象。這樣,永恆就必須找到mx的戰壕中保護對象最多的點,從而優先消滅它。 現在,由於永恆沒有時間來計算,所以拜託你來完成這個任務: 給出這n個戰壕的座標xi、yi,要你求出保護對象個數爲0,1,2……n-1的戰壕的個數。
Input
第一行,一個正整數n(1< =n< =15000) 接下來n行,每行兩個數xi,yi,代表第i個點的座標 (1< =xi,yi< =32000) 注意:可能包含多重戰壕的情況(即有數個點在同一座標)
Output
輸出n行,分別代表保護對象爲0,1,2……n-1的戰壕的個數。
Sample Input
Sample Output
#include<stdio.h>
#include<algorithm>
using namespace std;
int ans[15001],n,c[32001];
void update(int x)
{
while(x<=32001)
{
c[x]++;
x+=x&-x;
}
}
int query(int x)
{
int sum=0;
while(x)
{
sum+=c[x];
x-=x&-x;
}
return sum;
}
struct Dis
{
int x,y;
}dis[15001];
bool cmp(Dis a,Dis b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int main()
{
int i,idx=1,flag=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d%d",&dis[i].x,&dis[i].y);
sort(dis+1,dis+n+1,cmp);
for(i=1;i<=n;)
{
while(dis[i].x==dis[i+idx].x&&dis[i].y==dis[i+idx].y)
idx++;
ans[query(dis[i].y)]+=idx;
update(dis[i].y);
i+=idx;
idx=1;
}
for(i=0;i<n;i++)
printf("%d\n",ans[i]);
}
從二維拍成一維,只需要看dis[i].y的大小.