bzoj1818 Cqoi2010 內部白點

2021-08-01 18:06:47 字數 1396 閱讀 8818

description

無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的(網格的頂點即座標為整數的點,又稱整點)。每秒鐘,所有內部白點同時變黑,直到不存在內部白點為止。你的任務是統計最後網格中的黑點個數。 內部白點的定義:乙個白色的整點p(x,y)是內部白點當且僅當p在水平線的左邊和右邊各至少有乙個黑點(即存在x1 < x < x2使得(x1,y)和(x2,y)都是黑點),且在豎直線的上邊和下邊各至少有乙個黑點(即存在y1 < y < y2使得(x,y1)和(x,y2)都是黑點)。

input

輸入第一行包含乙個整數n,即初始黑點個數。以下n行每行包含兩個整數(x,y),即乙個黑點的座標。沒有兩個黑點的座標相同,座標的絕對值均不超過109。

output

輸出僅一行,包含黑點的最終數目。如果變色過程永不終止,輸出-1。

sample input

0 22 0

-2 0

0 -2

sample output

資料範圍

36%的資料滿足:n < = 500

64%的資料滿足:n < = 30000

100%的資料滿足:n < = 100000

題解 我們只需求出有多少個整點滿足上下左右都存在黑點。

也就是計算線段的交點。

採用掃瞄線演算法。大概就是把線段按照y端點排序,類似查分陣列,一端+1,一端-1。然後查詢x軸即可。

**

#include

#define n 100005

#define ll long long

#define mo 1000000007

using

namespace

std;

int t[n],n,cnt,ans,hash[100001];

struct node1a[n];

struct node2s[n*5];

inline

bool cmp1(node1 a,node1 b)

while(ch>='0'&&ch<='9')

return x*f;

}int find(int x) }

void insert(int k,int l,int r,int p)

else

}void build()

int lowbit(int x)

int getsum(int x)

void update(int x,int k)

void work()

}int main()

sort(hash+1,hash+n+1);

build();

sort(s+1,s+cnt+1,c***);

work();

cout

0;}

BZOJ1818 Cqoi2010 內部白點

給定平面上的一些黑點,其它位置都是白點,乙個白點如果上下左右都有黑點就會變成黑點,求最終會有多少個黑點 就是求交點個數 離散化後,取出所有線段,然後沿任意乙個軸朝著乙個方向掃,然後把平行於另乙個軸的線段用端點記錄,掃到一端就在樹狀陣列裡 1,另一端 1,樹狀陣列求個區間和貢獻答案即可 const m...

bzoj1818 Cqoi2010 內部白點

description 無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的 網格的頂點即座標為整數的點,又稱整點 每秒鐘,所有內部白點同時變黑,直到不存在內部白點為止。你的任務是統計最後網格中的黑點個數。內部白點的定義 乙個白色的整點p x,y 是內部白點當且僅當p在水平線的左邊和右邊各至少...

bzoj1818 Cqoi2010 內部白點

time limit 10 sec memory limit 64 mb submit 1218 solved 570 submit status discuss 無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的 網格的頂點即座標為整數的點,又稱整點 每秒鐘,所有內部白點同時變黑,直到不存...