HDU1828矩形周長合併(線段樹 離散)

2021-08-07 14:32:22 字數 1249 閱讀 1582

和面積合併類似,只不過要多記錄有多少個不連續的線段。如總長為4,可能是1-2,3-4兩段,也可能是1-4一段,計算面積是一樣但計算周長就不一樣了。

以下程式來自網上,收藏備參考。

#include 

#include

#include

using

namespace

std;

const

int n = 5e3+5;

#define lson u<<1

#define rson u<<1|1

struct seg

seg(int x,int y1,int y2,int i):x(x),y1(y1),y2(y2),pos(i&1){}

bool

operator

< (const seg& s) const

}s[n<<1];

int y[n<<1];

bool del; //用法不好,強制轉換

//l,r是不需要的,作為引數傳遞即可

struct segtree

inline

int len()

}t[n<<3];

void get_len(int u)

void get_cnt(int u)

else

if(t[u].l == t[u].r-1)

else

}void build(int u,int l,int r)

void updata(int u,int l,int r)

int m = t[u].mid();

if(r <= y[m])

updata(lson,l,r);

else

if(l >= y[m])

updata(rson,l,r);

else

updata(lson,l,y[m]) , updata(rson,y[m],r);

get_len(u);

get_cnt(u);

}int solve(int n)

return res;

}int main()

sort(y,y+n);

int nn = unique(y,y+n) - y;

build(1,0,nn-1);

sort(s,s+n);

printf("%d\n",solve(n));

}return

0;}

HDU 1828 掃瞄線求周長

思路 可以使用1條掃瞄線.從下往上我掃,在掃的過程中,周長就是下面的橫座標的投影加上上下兩條座標之差乘上縱座標線段數 需要注意重邊 include include include include include include include include include include defi...

hdu 1828線段樹掃瞄線求周長並

include include include include include include include include include include include include include include include define iinf 2000000000 define ...

hdu1828線段樹 掃瞄線

矩形求周長類似矩形合併求面積,只是多了需要統計豎邊的個數,對於每次求到的下底邊長還要增加目前底邊與下一條底邊之間的豎邊總長 1,n個矩形有2 n條線段,按從小到大排列,如上圖得到的線段順序 開始掃瞄第一條線段,得到總底邊長sum為a這部分,得到豎邊個數segnum 2,每增加一條底邊segnum 2...