Welcome, Guest! Sign Up RSS

Clever Space

Friday, 11.22.2024
Main » 2013 » October » 20 » [POJ Hotel]终于A了。
12:58 PM
[POJ Hotel]终于A了。

还是GSS的思想

把区间分开,段用lazy-tag更新(ps:写死了)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
#define FOR(i,a,b) for(i=(a);i<=(b);i++)
#define ROF(i,a,b) for(i=(a);i>=(b);i--)
#define pb push_back
#define mp make_pair
#define LC(x) ((x)<<1)
#define RC(x) (((x)<<1)+1)
#define N 50100
using namespace std;
typedef long long LL;
typedef long double LD;
struct node
{
  int l,r,fill,lm,rm,om;
  int dis(){return r-l+1;}
  void init(){lm=rm=om=dis();fill=0;}
  void calc(){if (fill==0) lm=rm=om=dis();else if (fill==1) lm=rm=om=0;}
};
struct segtree
{
  node tree[3*N];
  void update(int x)
  {
    node lc=tree[LC(x)],rc=tree[RC(x)];
    if (lc.fill==0) tree[x].lm=lc.lm+rc.lm;else tree[x].lm=lc.lm;
    if (rc.fill==0) tree[x].rm=rc.rm+lc.rm;else tree[x].rm=rc.rm;
    tree[x].om=max(lc.om,rc.om);
    tree[x].om=max(tree[x].om,tree[x].lm);
    tree[x].om=max(tree[x].om,tree[x].rm);
    tree[x].om=max(tree[x].om,lc.rm+rc.lm);
    if (lc.fill==1&&rc.fill==1) tree[x].fill=1;
    else if (lc.fill==0&&rc.fill==0) tree[x].fill=0;
    else tree[x].fill=-1;
  }
  void pushdown(int x)
  {
    if (tree[x].fill==-1) return;    
    if (tree[x].fill==0) 
    {
      tree[LC(x)].fill=0;tree[LC(x)].calc();
      tree[RC(x)].fill=0;tree[RC(x)].calc();
    }else
    {
      tree[LC(x)].fill=1;tree[LC(x)].calc();
      tree[RC(x)].fill=1;tree[RC(x)].calc();
    }
    tree[x].fill=-1;
  }
  void build(int x,int L,int R)
  {
    tree[x].l=L;tree[x].r=R;int M=(L+R)>>1;
    if (L==R) {tree[x].init();return;}
    build(LC(x),L,M);build(RC(x),M+1,R);update(x);
  }
  void insert(int x,int L,int R,int d)
  {
    if (tree[x].l==L&&tree[x].r==R) {tree[x].fill=d;tree[x].calc();return;}
    pushdown(x);
    int M=(tree[x].l+tree[x].r)>>1;
    if (R<=M) insert(LC(x),L,R,d);
    else if (L>M) insert(RC(x),L,R,d);
    else {insert(LC(x),L,M,d);insert(RC(x),M+1,R,d);}
    update(x);
  }
  int query(int x,int w)
  {
    if (tree[x].l==tree[x].r) return tree[x].l;
    pushdown(x);
    if (tree[LC(x)].om>=w) return query(LC(x),w);
    else if (tree[LC(x)].rm+tree[RC(x)].lm>=w) return tree[LC(x)].r-tree[LC(x)].rm+1;
    else if (tree[RC(x)].om>=w) return query(RC(x),w);
    else return 0;
  }
}Tree;
int main()
{
  ios::sync_with_stdio(false);
  int n,m,i,ans,op,t1,t2;
  while (scanf("%d %d",&n,&m)!=EOF)
  {
    Tree.build(1,1,n);
    FOR(i,1,m)
    {
      scanf("%d",&op);
      if (op==1) 
      {
        scanf("%d",&t1);int ans=Tree.query(1,t1);
        printf("%d\n",ans);
        if (ans) Tree.insert(1,ans,ans+t1-1,1);
      }else if (op==2)
      {
        scanf("%d %d",&t1,&t2);
        Tree.insert(1,t1,t1+t2-1,0);
      }
    }
  }
  return 0;
}

Views: 321 | Added by: dhy0077 | Rating: 0.0/0
Total comments: 0
Only registered users can add comments.
[ Sign Up | Login ]