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的連續房間,並將房間全部填滿,輸出...