覆蓋的面積 HDU 1255(掃瞄線求面積交)

2022-06-12 10:48:14 字數 1521 閱讀 3461

題意:

就是掃瞄線求面積交

解析:參考求面積並。。。。 就是把down的判斷條件改了一下。。由w > 0 改為 w > 1 同時要討論一下 == 1 時  的情況, 所以就要用到乙個臨時的sum。。

具體看**把

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define mod 2018

#define ll long long

#define ull unsigned long long

#define pair pair#define mem(a, b) memset(a, b, sizeof(a))

#define _ ios_base::sync_wity_stdio(0),cin.tie(0)

//freopen("1.txt", "r", stdin);

using

namespace

std;

const

int maxn = 2010, inf = 0x7fffffff

;double x[maxn]; //

記錄x的座標

struct

nodenode[maxn*3

];struct

edgeedge[maxn];

intcmp(edge a, edge b)

void build(int k, int ll, int rr) //

建樹void down(int k) //

計算長度

else

if(node[k].w == 1

)

else

}}void update(int k, edge e) //

更新

if(e.rxx <= node[k*2].rx) update(k*2

, e);

else

if(e.lxx >= node[k*2+1].lx) update(k*2+1

, e);

else

down(k);

}int

main()

sort(edge+1, edge+cnt+1

, cmp);

sort(x+1, x+cnt+1

);

int m = unique(x+1, x+cnt+1) - (x+1

); build(

1, 1

, m);

double ret = 0

;

for(int i=1; i)

printf(

"%.2f\n

",ret);

}return0;

}

hdu 1255 覆蓋的面積 掃瞄線

一道挺簡單的題,讓我折騰了許久。主要卡在了更新節點後維護父親節點上。後來思路明確了就很容易了。節點資訊 l,r 區間端點 cnt 區間被覆蓋的次數,cnt 0說明沒有被完全覆蓋。len1 區間被覆蓋的長度 len2 區間至少被兩條線段覆蓋的長度。只要找到父親節點與子節點在len1,len2,cnt的...

HDU 1255 覆蓋的面積 線段樹 掃瞄線

還是先離散化座標,然後用線段樹掃瞄線 其中sum代表被覆蓋過一次的長度,sum2代表被覆蓋過2次及以上的長度。然後注意pushup操作比較麻煩。id sdj22251 prog subset lang c include include include include include include...

hdu 1255 覆蓋的面積 線段樹 掃瞄線

一直想搞線段樹的掃瞄線,這道題算是入門了吧。這題需要用到 離散化,因為座標是浮點數。還有就是線段樹中的掃瞄線的知識,另外,這題需要求重複的面積和,所以在運用線段樹的時候需要更新到葉子節點。每乙個葉子節點儲存的是離散化後長度為1的線段。跟區間更新啥的還是挺像的,就是那些乙個葉子節點表示乙個點,這個是表...