雙線段樹+區間合併
sum儲存最大區間長度,lsum儲存鄰接左邊界最大區間長度,rsum則是右邊界
合併時可以通過這些計算出父節點的值
對於屌絲的邀請和女神的邀請可以安排兩個線段樹來查詢時間
詳見**
#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int maxn=100000+10; //陣列大小
int dsum[maxn<<2],dlsum[maxn<<2],drsum[maxn<<2]; //屌絲樹
int nsum[maxn<<2],nlsum[maxn<<2],nrsum[maxn<<2]; //女神樹
int lazy[maxn<<2];
void pushup(int rt,int l,int r)
void pushdown(int rt,int l,int r)
else
else
}lazy[rt]=0;
}}void build(int l,int r,int rt)
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
pushup(rt,l,r);
}void update(int l,int r,int f,int l,int r,int rt)
else
lazy[rt]=f;
return;
}if(l==r) return;
pushdown(rt,l,r);
int m=(l+r)>>1;
if(l<=m) update(l,r,f,l,m,rt<<1);
if(r>m) update(l,r,f,m+1,r,rt<<1|1);
pushup(rt,l,r);
}int query_d(int len,int l,int r,int rt)
int query_n(int len,int l,int r,int rt)
int main()
else printf("fly with yourself\n");
}else if(s[0]=='n')
else if(nsum[1]>=a)
else printf("wait for me\n");
}else}}
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 的左...
hdu4553約會安排 線段樹
ds qt 找一段最靠前的長度為qt的空間 ns qt 找一段最靠前的長度為qt的空間。假設沒找到能夠將ds占領的空間當做空暇空間,找一段最靠前的空間 study l r 清空l r的空間 用兩個線段樹,乙個處理ds的情況。乙個處理ns的情況 線段樹維護,ma l ma r ma 區間 l,r 的左...