time limit: 10 sec
memory limit: 64 mb
submit: 1218
solved: 570 [
submit][
status][
discuss]
無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的(網格的頂點即座標為整數的點,又稱整點)。每秒鐘,所有內部白點同時變黑,直到不存在內部白點為止。你的任務是統計最後網格中的黑點個數。 內部白點的定義:乙個白色的整點p(x,y)是內部白點當且僅當p在水平線的左邊和右邊各至少有乙個黑點(即存在x1 < x < x2使得(x1,y)和(x2,y)都是黑點),且在豎直線的上邊和下邊各至少有乙個黑點(即存在y1 < y < y2使得(x,y1)和(x,y2)都是黑點)。
輸入第一行包含乙個整數n,即初始黑點個數。以下n行每行包含兩個整數(x,y),即乙個黑點的座標。沒有兩個黑點的座標相同,座標的絕對值均不超過109。
輸出僅一行,包含黑點的最終數目。如果變色過程永不終止,輸出-1。
40 2
2 0-2 0
0 -2
5資料範圍
36%的資料滿足:n < = 500
64%的資料滿足:n < = 30000
100%的資料滿足:n < = 100000
題解:很好的一道題。hzwer講的很不錯。
首先證明不可能出現輸出-1的情況:(其實黑點的增長只會發生在第一秒)
反設白點i在第一秒時由於某個方向(設為上方)沒有黑點,就沒有變成黑點,而在後來又成為了黑點。
此時在i點上方必有了黑點j,而j要成為黑點,j的上方必存在乙個黑點,而那個黑點同時也在i的上方,
所以i一開始將成為黑點,矛盾!
那麼我們只需求出有多少個整點滿足上下左右都存在黑點。
然後先離散化橫座標,將橫縱座標相等的點看做豎線和橫線,也就是分別按照點的x,y排序得到所有的線段
然後對所有線段進行排序,從下往上掃瞄,用樹狀陣列維護區間和
如果碰到一條豎線下端點,將樹狀陣列中其橫座標位置的值+1
碰到一條橫線,就詢問左端點到右端點並加入答案
如果碰到一條豎線上端點,將樹狀陣列中其橫座標位置的值-1
想完這些我們可以發現,對於一條豎線段,我們可以把它的倆個端點分開和橫線一起存入結構體,這樣同時可以解決排序的問題
對線段進行排序時,如果y相同,上端點要在最前,下端點在最後
**:
#include#include#includeusing namespace std;
int n,cnt,ans,hash[100001],tr[100001];
struct pointa[100001];
struct segs[1000001];
inline bool cmp1(point a,point b) }
void insert(int k,int l,int r,int t)//0橫線,1豎線
else
}void build()
int lowbit(int x)
void update(int x,int y)
}int ask(int x)
return s;
}void work()
}int main()
sort(hash+1,hash+n+1);
build();
sort(s+1,s+cnt+1,c***);
work();
printf("%d",ans+n);
return 0;
}
BZOJ1818 Cqoi2010 內部白點
給定平面上的一些黑點,其它位置都是白點,乙個白點如果上下左右都有黑點就會變成黑點,求最終會有多少個黑點 就是求交點個數 離散化後,取出所有線段,然後沿任意乙個軸朝著乙個方向掃,然後把平行於另乙個軸的線段用端點記錄,掃到一端就在樹狀陣列裡 1,另一端 1,樹狀陣列求個區間和貢獻答案即可 const m...
bzoj1818 Cqoi2010 內部白點
description 無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的 網格的頂點即座標為整數的點,又稱整點 每秒鐘,所有內部白點同時變黑,直到不存在內部白點為止。你的任務是統計最後網格中的黑點個數。內部白點的定義 乙個白色的整點p x,y 是內部白點當且僅當p在水平線的左邊和右邊各至少...
bzoj1818 Cqoi2010 內部白點
description 無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的 網格的頂點即座標為整數的點,又稱整點 每秒鐘,所有內部白點同時變黑,直到不存在內部白點為止。你的任務是統計最後網格中的黑點個數。內部白點的定義 乙個白色的整點p x,y 是內部白點當且僅當p在水平線的左邊和右邊各至少...