無限大正方形網格裡有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
正解:掃瞄線+樹狀陣列。
容易發現,如果乙個白點的上下左右都有黑點,那麼它就能變成白點。
所以點是可以直接離散化的,無數點的情況也是沒有的。
於是直接寫乙個掃瞄線,掃瞄每一列,然後用樹狀陣列統計每一行是否上下都有黑點就行了。
1 #include 2#define il inline
3#define rg register
4#define ll long long
5#define lb(x) (x & -x)
6#define inf (1<<30)
7#define n (100005)89
using
namespace
std;
1011
struct pointp[n];
1213 vectorg[n];
14int
hsh[n],num[n],cnt[n],can[n],c[n],mn[n],mx[n],n,tot;
15ll ans;
1617 il int
gi()
2425 il void add(rg int x,rg int
v)28
29 il int query(rg int
x)33
34int
main()
51for (rg int i=1;i<=n;++i)
57if (mn[i]!=mx[i]) ans+=query(mx[i]-1)-query(mn[i])+2; else ++ans;
58for (rg int j=0,k;jj)62}
63 cout64 }
BZOJ1818 Cqoi2010 內部白點
給定平面上的一些黑點,其它位置都是白點,乙個白點如果上下左右都有黑點就會變成黑點,求最終會有多少個黑點 就是求交點個數 離散化後,取出所有線段,然後沿任意乙個軸朝著乙個方向掃,然後把平行於另乙個軸的線段用端點記錄,掃到一端就在樹狀陣列裡 1,另一端 1,樹狀陣列求個區間和貢獻答案即可 const m...
bzoj1818 Cqoi2010 內部白點
description 無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的 網格的頂點即座標為整數的點,又稱整點 每秒鐘,所有內部白點同時變黑,直到不存在內部白點為止。你的任務是統計最後網格中的黑點個數。內部白點的定義 乙個白色的整點p x,y 是內部白點當且僅當p在水平線的左邊和右邊各至少...
bzoj1818 Cqoi2010 內部白點
description 無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的 網格的頂點即座標為整數的點,又稱整點 每秒鐘,所有內部白點同時變黑,直到不存在內部白點為止。你的任務是統計最後網格中的黑點個數。內部白點的定義 乙個白色的整點p x,y 是內部白點當且僅當p在水平線的左邊和右邊各至少...