bzoj1818 Cqoi2010 內部白點

2021-08-19 14:57:19 字數 1777 閱讀 4865

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在水平線的左邊和右邊各至少...