矩形有重疊,求總面積。
橫縱兩條掃瞄線:
#includeusing namespace std;
double x[2002],y[2002];//最多100個矩形,所以最多只有200條橫線或縱線
double a[1002][4];//矩形實際座標,分別是左下角橫、縱,右下角橫、縱
bool cover[2002][2002];
const double eps = 1e-7;
int cmp(const void * b,const void * a)
int main()
double sum=0;
//這時再用掃瞄線真實的位置計算面積,由矩形左下角的點(判斷是否覆蓋)及四條掃瞄線確定。
for(i=0;i<2*n-1;i++)
for(j=0;j<2*n-1;j++)
sum+=(cover[i][j]*(x[i+1]-x[i])*(y[j+1]-y[j]));
printf("%d\n", (int)round(sum));
} }
掃瞄線模板
突然意識到忘記掃瞄線怎麼寫叻,趕快補補。我是離散化了y座標,將x座標排序,線段樹裡面下標是離散後的y,存的是實際的覆蓋了的y的長度。主要是 update 的時候,如果當前整個區間都被覆蓋叻,那麼直接更新成這段的實際長度。如果已經到葉子節點,長度就是0,剩下是沒有被覆蓋完的情況,就用左右兒子更新。查詢...
P5490 模板 掃瞄線 掃瞄線
題目描述 求 n 個矩形的面積並。輸出格式 一行乙個正整數,表示 n 個矩形的並集覆蓋的總面積。発生 線段樹開小了,因為n變成了兩倍,線段樹就得開4 2 8倍 對每一根掃瞄線,維護所截得的長度,每次乘以兩根掃瞄線高度差就得到了面積並 截得長度用線段樹維護即可 注意線段樹需要離散化 include i...
線段樹 掃瞄線 P5490 模板 掃瞄線
首先有這麼一張圖,要求它的面積並。我們想,如果可以有一條掃瞄線從下往上掃,記錄它所掃到的邊的長度 並 len 再求出這條邊與即將掃到的下一條邊的距離 h 那麼我們就可以求出第一塊面積 紫色 s 1 len times h 然而如何求出這個 len 顯然只用當前邊的長度是不行的,如 當掃到邊 r 2 ...