解法:樹狀陣列
題意轉化為求線段的交點個數。
先將任一座標離散化,這裡以
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在水平線的左邊和右邊各至少...