題意:1 a表示如果有長度為a的連續的空房間,則占用
2 a b表示清空[a,a+b-1]的房間
思路:線段樹區間維護,除了考慮區間上最大空房間,還要維護左邊最大連續和右邊最大連續
#include #include #include #include using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 55555;
int lsum[maxn<<2] , rsum[maxn<<2] , msum[maxn<<2];
int cover[maxn<<2];
void pushdown(int rt,int m)
}void pushup(int rt,int m)
void build(int l,int r,int rt)
void update(int l,int r,int c,int l,int r,int rt)
pushdown(rt , r - l + 1);
int m = (l + r) >> 1;
if (l <= m) update(l , r , c , lson);
if (m < r) update(l , r , c , rson);
pushup(rt , r - l + 1);
}int query(int w,int l,int r,int rt)
int main()
} else
} return 0;
}
自己的:
#include#include#include#includeusing namespace std;
const int maxn=50010;
int n,m;
int ans;
struct intevaltree
}void build(int o,int l,int r)
void pushdown(int o,int l,int r)
}void update(int o,int l,int r,int q1,int q2,int flag)
maintain(o,l,r);
}int query(int o,int l,int r,int x)
}tree;
int main()
{ //freopen("in.txt","r",stdin);
int a,b,op;
scanf("%d%d",&n,&m);
tree.build(1,1,n);
while(m--)
{scanf("%d",&op);
if(op==1)
{scanf("%d",&a);
if(tree.sum[1]
poj3667 線段樹(區間合併)
題意 有編號為1 n的n個房間,有兩種詢問 1.有人來訂連續的k間房,有的話返回第一間房的編號,否則返回0。2.有人退連續的從a開始的連續的k間房。1.該區間最大的連續空房數 2.該區間從最左邊起的最大的連續空房數 3.該區間從最右邊起的最大的連續空房數 根據以上三個資訊,每個非葉結點的資訊都可以由...
poj 3667 線段樹 區間合併
感想 沒有什麼說的了。越做線段樹越感覺自己水。這個我感覺自己就真坑了大家了。難的不會,簡單的也水不過了。哎,最近這是什麼情況啊!題目 題意 旅館有編號為1 n的房間,現在可能有m波人過了租房,每波人可能要定連續的d間房,如果有的話,編號盡量小,沒有的話就說0,也可能有d個人要退房,他們的房是連續的x...
poj3667 線段樹區間合併)
思路 線段樹的區間合併,lm表示該區間從左邊開始最大的空區間,mm表示該區間最大的空區間,rm表示從右邊數最大的空區間 注意向下更新 include includeusing namespace std const int n 50005 struct node d n 3 int max int ...