線段樹 區間合併

2021-06-20 12:33:53 字數 1586 閱讀 3434

1 poj 3667

題意:支援兩種操作 1 如果有連續長度大於d的房間,則輸出最左的區間值, 否則輸出0;2 將ql, qr區間的房間標記為             未入住

思路:節點維護三個域, 該節點的最大房間數,該節點左端點起的最大房間數, 該房間右端點起的最大連續房間數,用線段樹進行更新和查詢

#include 

#include

using namespace std;

const int maxn = 50010;

typedef struct

node;

node a[maxn*4];

int col[maxn*4], ql, qr;

int n, m, t, v;

void construct(int o, int l, int r)

void pushdown(int o, int l, int r)

}void pushup(int o, int l, int r)

int query(int o, int l, int r)

void update(int o, int l, int r)

pushdown(o, l, r);

int m = (l+r) / 2;

if(ql <= m) update(2*o, l, m);

if(qr > m) update(2*o+1, m+1, r);

pushup(o, l, r);

}int main()

}else}}

return 0;

}

2 hdu 3397

和上一題差不多, 不多說

#include 

#include

using namespace std;

const int maxn = 100010;

typedef struct

node;

node a[maxn*4];

int b[maxn], ql, qr;

int n, m, p, x, t;

char s[5];

void pushup(int o,int l, int r)

void construct(int o, int l, int r)

int m = (l+r) / 2;

construct(2*o, l, m);

construct(2*o+1, m+1, r);

pushup(o, l, r);

}void update(int o, int l, int r)

int m = (l+r) / 2;

if(p <= m)

update(2*o, l, m);

else

update(2*o+1, m+1, r);

pushup(o, l, r);

}int query(int o, int l, int r)

int main()

else}}

return 0;

}

線段樹 區間合併

hdu 1540 tunnel wa re 詳細見 include include include include include define max 50010 define lson l,m,k 1 define rson m 1,r,k 1 1 using namespace std typ...

線段樹 區間合併

線段樹的區間合併,即尋找 詢問區間中滿足條件的連續最長區間。而乙個區間連續的最長區間有兩種情況 1 此連續最長區間全在左子樹或全在右子樹,則sum t max sum t 1 sum t 1 1 2 一部分在左子樹,一部分在右子樹,則sum t suml t 1 1 sum t 1 因此,我們需要記...

線段樹區間合併

線段樹區間合併主要解決一段連續區間修改,查詢問題。線段樹是樹形結構,為解決相鄰區間更新,修改問題,我們必須在原本須要維護的區間內,連續段最大值的基礎上加上,從左,右兩邊起,最大的連續區間長度。例題 酒店 此題開始時,所有的房間都是空房間,有兩個操作 1 查詢長度為x的連續房間,並將房間全部填滿,輸出...