线段树 hdu 2871 memory control

直接把hotel那题的代码拿过来,其他的都用stl来做了

View Code
#include<cstdio>
#include<vector>
#include<algorithm>
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],cover[maxn<<2];
struct node {
int l,r;
bool operator < (const node &cmp) const {
return l<cmp.l;
}
}tno;
vector<node> mem;
void pushup(int rt,int m){
lsum[rt]=lsum[rt<<1];
rsum[rt]=rsum[rt<<1|1];
if(lsum[rt] == m-(m>>1)) lsum[rt]+=lsum[rt<<1|1];
if(rsum[rt] == (m>>1)) rsum[rt]+=rsum[rt<<1];
msum[rt]=max(lsum[rt<<1|1]+rsum[rt<<1],max(msum[rt<<1],msum[rt<<1|1]));
}
void pushdown(int rt ,int m){
if(cover[rt]!=-1){
cover[rt<<1]=cover[rt<<1|1]=cover[rt];
msum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=cover[rt] ? 0 :m-(m>>1);
msum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=cover[rt] ? 0 : (m>>1);
cover[rt]=-1;
}
}
void build(int l,int r,int rt){
msum[rt]=lsum[rt]=rsum[rt]=r-l+1;
cover[rt]=-1;
if(l==r) return ;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l&&r<=R){
msum[rt]=lsum[rt]=rsum[rt]= c ? 0 : r-l+1;
cover[rt]=c;
return ;
}
pushdown(rt,r-l+1);
int m=(l+r)>>1;
if(L <= m) update(L,R,c,lson);
if(R > m) update(L,R,c,rson);
pushup(rt,r-l+1);
}
int query(int w,int l,int r,int rt){
if(l==r) return l;
pushdown(rt,r-l+1);
int m=(l+r)>>1;
if(msum[rt<<1]>=w) return query(w,lson);
else if(rsum[rt<<1]+lsum[rt<<1|1]>=w) return m-rsum[rt<<1]+1;
return query(w,rson);
}
int main(){
int n,m,i,j,k,a,b,c,pos;
char str[10];
vector<node> :: iterator it;
while(~scanf("%d%d",&n,&m)){
build(1,n,1);
mem.clear();
while(m--){
scanf("%s",str);
if(str[0]=='N'){
scanf("%d",&a);
if(msum[1]<a) puts("Reject New");
else {
b=query(a,1,n,1);
update(b,b+a-1,1,1,n,1);
tno.l=b;tno.r=b+a-1;
it=upper_bound(mem.begin(),mem.end(),tno);
mem.insert(it,tno);
printf("New at %d\n",b);
}
}
else if(str[0]=='F'){
scanf("%d",&a);
tno.l=a;tno.r=a;
pos=upper_bound(mem.begin(),mem.end(),tno)-mem.begin()-1;
if(pos==-1||mem[pos].r<a) puts("Reject Free");
else {
printf("Free from %d to %d\n",mem[pos].l,mem[pos].r);
update(mem[pos].l,mem[pos].r,0,1,n,1);
mem.erase(mem.begin()+pos);
}
}
else if(str[0]=='G'){
scanf("%d",&a);
if(a>mem.size()) puts("Reject Get");
else printf("Get at %d\n",mem[a-1].l);
}
else if(str[0]=='R'){
update(1,n,0,1,n,1);
puts("Reset Now");
mem.clear();
}
}
puts("");
}
return 0;
}

 

posted @ 2012-01-31 19:33  Because Of You  Views(263)  Comments(0Edit  收藏  举报