日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***

發布時間:2025/3/15 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 1542:Atlantis(扫描线+线段树 矩形面积并)*** 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

題意

給出n個矩形,求面積并。

思路

使用掃描線,我這里離散化y軸,按照x坐標從左往右掃過去。離散化后的y軸可以用線段樹維護整個y上面的線段總長度,當碰到掃描線的時候,就可以統計面積。這里要注意線段樹上結點維護的是線段的信息,而不是點的信息。
參考資料

#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> pii; const int INF = 0x3f3f3f3f; const int N = 1e5 + 10; #define lson l, m, rt<<1 #define rson m + 1, r, rt<<1|1 struct Node {int st;double l, r, id;bool operator < (const Node &rhs) const {return id < rhs.id;} } p[N]; double y[N], tree[N<<2]; int cnt[N<<2];void PushUp(int l, int r, int rt) {if(cnt[rt] > 0) tree[rt] = y[r+1] - y[l]; // r + 1是因為線段樹上結點是線段,映射成點就要+1else if(l == r) tree[rt] = 0; // 當這個線段沒有cnt的時候就代表消失了else tree[rt] = tree[rt<<1] + tree[rt<<1|1]; }void Update(int L, int R, int w, int l, int r, int rt) {if(L <= l && r <= R) {cnt[rt] += w;PushUp(l, r, rt);return ;}int m = (l + r) >> 1;if(L <= m) Update(L, R, w, lson);if(m < R) Update(L, R, w, rson);PushUp(l, r, rt); }int main() {int cas = 1, n;while(scanf("%d", &n), n) {int cnt = 0, m = 0;for(int i = 1; i <= n; i++) {double x1, x2, y1, y2;scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);y[++cnt] = y1, y[++cnt] = y2;p[++m] = (Node) { 1, y1, y2, x1 };p[++m] = (Node) { -1, y1, y2, x2 };}sort(y + 1, y + 1 + cnt);sort(p + 1, p + 1 + m);cnt = unique(y + 1, y + 1 + cnt) - y - 1;double ans = 0;for(int i = 1; i <= m; i++) {ans += tree[1] * (p[i].id - p[i-1].id);int L = lower_bound(y + 1, y + 1 + cnt, p[i].l) - y;int R = lower_bound(y + 1, y + 1 + cnt, p[i].r) - y - 1;// R - 1是因為線段樹上的結點是線段Update(L, R, p[i].st, 1, cnt, 1);printf("%d : %d - %d , %.2f\n", i, L, R, tree[1]);}printf("Test case #%d\n", cas++);printf("Total explored area: %.2f\n\n", ans);}return 0; }

轉載于:https://www.cnblogs.com/fightfordream/p/7591674.html

總結

以上是生活随笔為你收集整理的HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。