title: poj-1151矩形面積並-線段樹
date: 2018-10-30 22:35:11
tags:
線段樹問題裡的另乙個問題,,,矩形面積並,,,,
之前看lazy更新時看到下面這個的講解,,,一大堆文字還有一大堆的圖,,,,當時果斷跳過,,,
今天花了一下午加一晚上的時間看了看這塊知識,,,然後嘗試自己寫出**,,,算是簡單的了解一下這塊,,,
這道矩形面積並問題的大意是給很多個矩形,,矩形之間可能有交集,,,然後問你這一大片的圖形面積是多少,,,,
資料量不大,,看到有很多人是暴力過的,,,
但是用線段樹來當作練習題鍛鍊鍛鍊思維還是很好的qaq
一開始我是看這篇部落格有關矩形面積並的知識,,,
這篇部落格講解的思路很不錯,,,一遍之後大致了解了整個解決問題的思路,,,,但是它沒有相應的練習題以及**,,,,我完全不知道該從**下手,,,線段樹的具體如何實現一臉懵逼,,,,還有,,,一般這種題都是要將乙個方向的座標離散化,,,,嗯,,又是這個東西,,,,更是一臉的懵逼,,,,
然後看了這篇部落格,,對著**,,,然後順著思路寫出來了,,,
主要的幾點:
#include #include #include #include #include using namespace std;
#define aaa cout << x[r + 1] << "----" << x[l] << endl;
const int maxn = 205;
double x[maxn << 2]; //所有的x的資料
//每一條線段
struct segment
segment(double y, double l , double r , int flag):y(y) , l(l) , r(r) , flag(flag){}
bool operator < (const segment &res)
}seg[maxn << 1];
//線段樹維護所有的單位線段(離散後的)
struct node
node[maxn << 2];
void pushdown(int rt , int l , int r)
void update(int rt , int l , int r , int l , int r , int cov)
int mid = (l + r) >> 1;
if(l <= mid) update(rt << 1 , l , mid , l , r , cov);
if(r > mid) update(rt << 1 | 1 , mid + 1 , r , l , r , cov);
//pushdown
pushdown(rt , l , r);
return;
}int main()
//離散
sort(seg , seg + count);
sort(x , x + count);
int sz = unique(x , x + count) - x;
double ans = 0;
for(int i = 0; i < count; ++i)
printf("test case #%d\ntotal explored area: %.2f\n\n",q++,ans);
}}
算了,,,先鴿了,,,細節那天再補一下,,,,
(loading,,,,)
poj 1151 線段樹求矩形面積的並
其實掌握了基本思路就沒問題了,不過還是能學到一些思想的。比如說,離散化,掃瞄線,計算幾何裡的線段樹建樹的不同。尤其是要注意離散化,許多線段樹問題都要離散化才能做,否則超記憶體。這題的離散化就是把座標的範圍,用存放它們的下標來表示。這樣一來範圍就小多了,然後每個節點表示的範圍就是這兩個下標 存放的對應...
矩形面積並(POJ 1151)
給你n個矩形,求這些矩陣的面積並n 掃瞄線思路 離散化 線段樹維護 關於掃瞄線 可以看下這篇部落格 關於離散化 由於座標範圍較大,需要使其更 緊密 這樣才能用線段樹處理 離散化的核心思想就是相對大小不變且能通過現在的值確定之前的值 所以離散化的方法就是 以y軸座標為例 將y軸座標塞入id陣列 2 n...
POJ 1151 線段樹 掃瞄線
cf上遇到一題掃瞄線,二話不說立刻補。該類題目計算座標中邊平行於x,y軸的矩形的覆蓋面積。這樣可以通過離散化x座標,然後建立區間,通過線段樹管理。然後每條掃瞄線更新區間覆蓋和計算面積。對於上面的矩形就有4條掃瞄線,有3個區間。第一條掃瞄線覆蓋1,2區間。第二條掃瞄線覆蓋2,3區間。第三條掃瞄線是第乙...