线段树 hdu 2871 memory control
2012-01-31 19:33
302 查看
直接把hotel那题的代码拿过来,其他的都用stl来做了
View Code
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; }
相关文章推荐
- HDU 2871 Memory Control (线段树,区间合并)
- HDU 2871 Memory Control (恶心线段树,HOTEL加强版)
- HDU 2871 Memory Control(线段树区间合并+二分)
- HDU 2871 Memory Control(线段树:区间合并)
- 线段树专辑—— hdu 2871 Memory Control
- hdu 2871 vector + 线段树 Memory Control
- hdu_2871_Memory Control(巨恶心线段树)
- HDU 2871 Memory Control 线段树
- hdu 2871 -Memory Control--线段树
- hdu_2871_Memory Control(巨恶心线段树)
- HDU 2871 Memory Control (线段树神题)
- HDU 2871——Memory Control(线段树,区间合并+vector+二分查找)
- POJ 3667 Hotel & HDU 2871 Memory Control 线段树区间合并
- HDU 2871 Memory Control 线段树
- HDU 2871 Memory Control(线段树区间合并+各种综合运用)【好题】
- HDU 2871 Memory Control (线段树区间合并)
- hdu 2871 Memory Control 线段树
- hdu 2871 Memory Control(线段树)
- hdu 2871 Memory Control(线段树)
- HDU-2871 Memory Control 线段树-区间合并