和面積合併類似,只不過要多記錄有多少個不連續的線段。如總長為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...