//ds qt 找一段最靠前的長度為qt的空間
//ns qt 找一段最靠前的長度為qt的空間。假設沒找到能夠將ds占領的空間當做空暇空間,找一段最靠前的空間
//study!! l r 清空l ,r的空間
//用兩個線段樹,乙個處理ds的情況。乙個處理ns的情況
//線段樹維護,ma_l , ma_r , ma 區間[l,r]的左邊的空暇區間,右邊的以及最大的空暇區間
#include
#include
#include
#include
using namespace std ;
const int maxn = 1e5 + 10;
#define left v<<1
#define right v<<1|1
struct node
tree[2][maxn<<2] ;
void build(int l , int r , int v)
if(l == r)return ;
int mid = (l + r)>>1 ;
build(l , mid , left) ;
build(mid+1 , r , right) ; }
void push_down(int v)
} void push_up(int v)
} int query(int v , const int flag , const int num)
void update(int a , int b , int v , const int flag , const int tag)
push_down(v) ;
int mid = (tree[flag][v].l + tree[flag][v].r) >> 1 ;
if(a <= mid)update(a , b , left , flag , tag) ;
if(b > mid)update(a , b , right , flag , tag) ;
push_up(v) ; }
int main()
int pos = query(1 , 1 , qt) ;
update(pos , pos + qt - 1 , 1 , 1 , 0) ;
printf("%d,let's fly\n" , pos) ; }
else if(ch[0] == 'n')
else if(tree[1][1].ma >= qt)
pos = query(1 , 1 , qt) ;
else pos = query(1 , 0 , qt) ;
printf("%d,don't put my gezi\n" , pos) ;
update(pos , pos + qt - 1 , 1 , 0 ,0) ;
update(pos , pos + qt - 1 , 1 , 1 , 0) ; }
else if(ch[0] == 's')
} }
return 0 ; }
HDU 4553 約會安排 線段樹
題意 有個屌絲有t的空閒時間。每次有人與他約t的時間,他都會找到最靠前的一段符合要求的時間,稱為 最先適應演算法 1,如果 約他,他就會按 最先適應演算法 去找,找到就約否則不約。2,如果女神約他,他也會先按原先的方法去找,如果找不到,那他會忽略所有與 的約定而通過原來的方法去找跟女神約會的時間,找...
hdu4553約會安排 線段樹
ds qt 找一段最靠前的長度為qt的空間 ns qt 找一段最靠前的長度為qt的空間,如果沒找到可以將ds佔據的空間當做空閒空間,找一段最靠前的空間 study l r 清空l r的空間 用兩個線段樹,乙個處理ds的情況,乙個處理ns的情況 線段樹維護,ma l ma r ma 區間 l,r 的左...
HDU 4553 約會安排 線段樹區間合併
需要3個標記,分別是左區間連續長度,右區間連續長度,中間區間的最大連續長度 最大可以通過更新回溯的過程中,pushup中更新 題目的難點是如何找合適的連續區間。因為題目要求的是最左邊的符合題目要求的區間,所以找區間的時候要先看左區間的連續長度,其次是中間區間的連續長度 因為中間可能會有多個連續的區間...