BZOJ1818 內部白點

2021-08-25 11:51:21 字數 1295 閱讀 1511

解法:樹狀陣列

題意轉化為求線段的交點個數。

先將任一座標離散化,這裡以

x x

為例。之後將

x' role="presentation" style="position: relative;">xx與

y y

座標分別排序,求出這些線段。以樣例為例,如下圖:(

x' role="presentation" style="position: relative;">x

x座標已離散化,只有在同一橫/縱座標上出現多個點時才會出現線段。)

將線段分兩種,橫與豎。

將橫線段拆為兩個點,豎線段不變。然後將這些東西排序。從左至右掃瞄(若是離散化

y y

座標則從下至上),掃瞄到橫線段的左端點時,將該橫線段的橫座標處的位置 +1

' role="presentation" style="position: relative;">+1+

1,掃瞄到橫線段的右端點則 −1

1;掃瞄到豎線段則查詢線段的上下端點,加入答案。區間查詢用樹狀陣列維護即可。

細節很多,實現時心態很容易崩( cm

p cmp

函式別打錯)

**

#include

#include

#include

#include

using

namespace

std;

struct data

data(int a,int b,int j):x(a),y(b),i(j){}

};struct upd

upd(int u,int y,int a,int b):t(u),x(y),l(a),r(b){}

friend

bool

operator

void update(int k,int x)

int query(int k)

int main()

sort(dt+1,dt+n+1,cmp1);

for(int i=1;i<=n;++i)

sort(v.begin(),v.end());

for(upd u:v)if(u.t==2)update(u.l,u.r);else ans+=query(u.r-1)-query(u.l);

printf("%lld",ans+n);

}

BZOJ1818 Cqoi2010 內部白點

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

bzoj1818 Cqoi2010 內部白點

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

bzoj1818 Cqoi2010 內部白點

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