POJ 1177 Picture(線段樹 掃瞄線)

2021-07-08 15:50:05 字數 1520 閱讀 8917

description

求n個矩形的周長並

input

第一行為一整數n表示矩形個數,之後n行每行四個整數x1,y1,x2,y2表示該矩形左下端點與右上端點的橫縱座標

output

輸出這n個矩形的周長並

sample input

7 -15 0 5 10

-5 8 20 25

15 -4 24 14

0 -6 16 4

2 15 10 22

30 10 36 20

34 0 40 16

sample output

228

solution

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 11111

struct tree

t[4*maxn];

//num表示這個區間被連續覆蓋部分的數量

//flag標記這個區間是否被完全覆蓋

//len表示這個區間被覆蓋的長度

//lf和rf表示這個區間的左右端點是否被覆蓋

struct line

line[maxn];

int n,cnt,res,y[maxn],ans,num,len;

void add(int x,int y1,int y2,int yy,int flag)

bool cmp(line l1,line l2)

void build(int l,int r,int t)

void update_num(int t)

}void update_len(int t)

void update(int l,int r,int z,int t)

}update_num(t);

update_len(t);

}int main()

sort(line,line+cnt,cmp);//對這些線段按橫座標公升序排序

//對y軸建樹

sort(y,y+cnt);

res=unique(y,y+cnt)-y;

build(0,res-1,1);

for(int i=0;iif(i) ans+=2*num*(line[i].x-line[i-1].x);//橫邊長度

ans+=abs(t[1].len-len);//縱邊長度

len=t[1].len;//更新被覆蓋的長度

num=t[1].num;//更新被連續覆蓋部分的數量

}printf("%d\n",ans);

} return

0;}

POJ 1177 Picture 矩形周長並

題意很簡單,但是周長並比面積並又稍微麻煩了一些 這時候要開乙個numseg儲存豎邊的個數。再開lbd,rbd分別表示邊界,這樣是為了幫助刪除重合的邊 id sdj22251 prog subset lang c include include include include include incl...

POJ 1177 Picture 矩形周長並

題意很簡單,但是周長並比面積並又稍微麻煩了一些 這時候要開乙個numseg儲存豎邊的個數。再開lbd,rbd分別表示邊界,這樣是為了幫助刪除重合的邊 id sdj22251 prog subset lang c include include include include include incl...

POJ 1177 Picture 矩形周長並

題意 給出 n 個矩形,可以相互覆蓋,求所有矩形合在一起的輪廓總長度。分析 先對所有矩形按左下角的y 座標排序,讓矩形的所有點向 x 軸投影,記錄所有的投影的x值,對x 排序,分段累加x 座標差值 如果 s i y1 up 說明兩個矩形沒有交集,即新的矩形沒有被前乙個矩形覆蓋到 res 2 righ...