題意:n個空房間。兩種操作:1.選擇最小的連續d個房間入住,並輸出這連續d個房間的最小標號。2.將某個區間內的房間全部退房。
1 #include 2 #include 3 #include 4#define ll long long
5#define lson l, m, rt<<1
6#define rson m+1, r, rt<<1|1
7#define st first
8#define nd second
9#define mp make_pair
10#define pii pair11
#define gg puts("gg");
12using
namespace
std;
13void gmax(int& a, int
b)16
const
int n = 5e4+10;17
struct
node;
21 node t[n<<2
];22
void pushup(int l, int r, int
rt)30
void pushdown(int l, int r, int
rt)38}39
void build(int l, int r, int
rt)48
int query(int c, int l, int r, int
rt)58
void update(int l, int r, int c, int l, int r, int
rt)64
pushdown(l, r, rt);
65int m = l+r >> 1;66
if(l <=m) update(l, r, c, lson);
67if(r >m) update(l, r, c, rson);
68pushup(l, r, rt);
69//
printf("updaet %d: l %d, r %d, lson %d, rson %d, sum %d\n", rt, l, r, t[rt].lsum, t[rt].rsum, t[rt].sum);70}
7172
intmain()86}
87else91}
92return0;
93 }
後記:這也是線段樹一經典題。不難。
主要是通過這種寫法可以o(logn)的時間內完成離散化查詢。不過平時一般都是二分+樹狀陣列o(lognlogn)完成離散化查詢。
線段樹重開poj 3667
本題目重做感受頗多,思考的深度決定了對線段樹的掌握程度,只有自己創生的才是自己的啊。本題用到了三個維護值,sum表示區間最長連續區間,lsum為區間左面最長連續區間長。rsum同理。現在來說明sum為什麼具有 可維護性,線段樹的可維護性是相對於更新區間而言的,因為更新的logn個區間總是被刷成全空房...
POJ 3667 線段樹 標記
自從某次考試寫線段樹寫掛了以後 這是第一次寫線段樹,這是乙個傷心的故事 題意 思路 標記 維護從左到右的最大值 從右到左的最大值 區間內的最大值 然後就一搞 就出來了 by siriusren include using namespace std int n,m,jy,xx,yy,d,d stru...
poj3667 線段樹(區間合併)
題意 有編號為1 n的n個房間,有兩種詢問 1.有人來訂連續的k間房,有的話返回第一間房的編號,否則返回0。2.有人退連續的從a開始的連續的k間房。1.該區間最大的連續空房數 2.該區間從最左邊起的最大的連續空房數 3.該區間從最右邊起的最大的連續空房數 根據以上三個資訊,每個非葉結點的資訊都可以由...