VIJOS-P1066 弱弱的戰壕題解

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

5
1 1
5 1
7 1
3 3
5 5

Sample Output

1
2
1
1
0
結構體排序+樹狀數組求和。
#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的大小.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章