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

2021-06-05 02:55:00 字數 1392 閱讀 6482

還是先離散化座標,然後用線段樹掃瞄線

其中sum代表被覆蓋過一次的長度,sum2代表被覆蓋過2次及以上的長度。

然後注意pushup操作比較麻煩。

/*

id: sdj22251

prog: subset

lang: c++

*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 2222

#define maxm 164444

#define inf 100000000

#define eps 1e-7

#define l(x) x<<1

#define r(x) x<<1|1

using namespace std;

struct node

tree[4 * maxn];

struct seg

seg(double a, double b, double c, int d)

bool operator <(const seg &cmp)const

}seg[2 * maxn];

double x[maxn];

int ct ;

void up(int c)

else if(tree[c].cnt == 1)

else

}else

}}void make_tree(int s, int e, int c)

void update(int s, int e, int v, int c)

if(tree[c].mid >= s) update(s, e, v, l(c));

if(tree[c].mid < e) update(s, e, v, r(c));

up(c);

}int bin(double v, int bound)

return -1;

}int main()

sort(x, x + m);

sort(seg, seg + m);

int k = unique(x, x + m) - x;

make_tree(0, k - 1, 1);

double ans = 0;

for(int i = 0; i < m - 1; i ++)

printf("%.2f\n", ans);

}return 0;

}

hdu 1255 覆蓋的面積 線段樹

記錄3個變數。sum i 當前區間被覆蓋2次及兩次以上的面積。num i 當前區間被覆蓋1次及一次以上的面積。cover i 覆蓋的lazy標記。對於每乙個區間.更新操作如下 void push up int now if cover rt 1 if cover rt 2 那麼剩下的問題就是簡單的區...

hdu 1255 覆蓋的面積(線段樹求面積交)

給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.雖說覆蓋兩次區域的面積,但是這道題實際上就是求矩形的面積交。膜拜能夠想出這種解法的神牛,竟然能把實際的東西用這麼抽象的語言表示出來,實在是佩服,現在關於掃瞄線的題才做了幾道,沒有對其深刻理解,但是多練總可以理解的,奮鬥吧!acmer!我是...

HDU 1255 覆蓋的面積(線段樹求矩形面積交)

題意 給出n個矩形,求出至少被兩塊矩形覆蓋的面積。思路 跟面積並類似的做法,不同的是每個節點要額外維護乙個至少被覆蓋兩次的長度dcnt,此外還是要維護至少覆蓋一次的長度cnt,然後每次由當前結點的cover標記和子節點的dcnt,cnt值來推出當前結點的dcnt,cnt值。include inclu...