hdu4553約會安排 線段樹

2021-09-07 11:56:15 字數 1518 閱讀 3039

//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中更新 題目的難點是如何找合適的連續區間。因為題目要求的是最左邊的符合題目要求的區間,所以找區間的時候要先看左區間的連續長度,其次是中間區間的連續長度 因為中間可能會有多個連續的區間...