線段樹 區間合併

2021-06-04 16:38:21 字數 2598 閱讀 6126

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;

typedef struct seg

seg;

seg seg[max<<2];

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

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

else

seg[k].dt=-1;

}}void init(int l,int r,int k)

int m = (l+r)>>1;

init(lson);

init(rson);

pushup(l,r,k);

}void update(int id,int v,int l,int r,int k)

pushdown(l,r,k);

int m = (l+r)>>1;

if(id<=m)

update(id,v,lson);

else

update(id,v,rson);

pushup(l,r,k);

}seg query(int ll,int rr,int l,int r,int k)

if(ll==l&&rr==r)

pushdown(l,r,k);

int m = (l+r)>>1;

seg ans;

if(rr<=m)

ans = query(ll,rr,lson);

else if(ll>m)

ans = query(ll,rr,rson);

else

pushup(l,r,k);

return ans;

}stack st;

int main()

else if(op[0]=='r')

else}}

}return 0;

}

hdu 2871 memory control

這道題其實就是維護乙個區間連續的0的情況,這裡包括將乙個區間置為0或1,;然後就是對於乙個塊,有乙個區間表示它所占用的記憶體單元,然後需要輸出編號為idx的單元所在的塊的起始標號和終止標號;還有乙個就是查詢第x個塊的起始位址。

對於前面第乙個要求,直接使用線段樹進行維護,記法和hotel是一樣的。

對於其他的兩個操作,我們已經很清楚的知道每乙個塊的左端點和右端點,維護乙個左端點有序的佇列,進行二分查詢。也就是說沒new乙個塊,那麼我們就向有序列中新增乙個塊的左右斷電的節點;沒刪除乙個塊,我們就將該點從序列中刪除。

如果有不明白還是看看我的**吧:

#include #include #include #include #include #define max 50100

#define lson l,m,k<<1

#define rson m+1,r,k<<1|1

using namespace std;

typedef struct seg

seg;

seg seg[max<<2];

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

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

else

seg[k].dt=-1;

}}void init(int l,int r,int k)

int m = (l+r)>>1;

init(lson);

init(rson);

pushup(l,r,k);

}void update(int ll,int rr,int v,int l,int r,int k)

else

return ;

}pushdown(l,r,k);

int m = (l+r)>>1;

if(rr<=m)

update(ll,rr,v,lson);

else if(ll>m)

update(ll,rr,v,rson);

else

pushup(l,r,k);

}int query(int x,int l,int r,int k)//查詢連續的x個0

typedef struct node

node;

vectormylist;

int find(int x)

return l;

}int main()

}else if(strcmp(op,"free")==0)

else

}else if(strcmp(op,"get")==0)

}else

}printf("\n");

}return 0;

}

線段樹 區間合併

1 poj 3667 題意 支援兩種操作 1 如果有連續長度大於d的房間,則輸出最左的區間值,否則輸出0 2 將ql,qr區間的房間標記為 未入住 思路 節點維護三個域,該節點的最大房間數,該節點左端點起的最大房間數,該房間右端點起的最大連續房間數,用線段樹進行更新和查詢 include inclu...

線段樹 區間合併

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

線段樹區間合併

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