心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
经典的区间合并题。
参考这篇文章学习的,http://www.notonlysuccess.com/?p=978
以下是我的代码:
/*
 * Author:  lee1r
 * Created Time:  2011/8/4 18:38:40
 * File Name: poj3667.cpp
 
*/
#include
<iostream>
#include
<sstream>
#include
<fstream>
#include
<vector>
#include
<list>
#include
<deque>
#include
<queue>
#include
<stack>
#include
<map>
#include
<set>
#include
<bitset>
#include
<algorithm>
#include
<cstdio>
#include
<cstdlib>
#include
<cstring>
#include
<cctype>
#include
<cmath>
#include
<ctime>
#define L(x) ((x)<<1)
#define R(x) ((x)<<1|1)
#define Half(x) ((x)>>1)
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int kInf(0x7f7f7f7f);
const double kEps(1e-11);
typedef 
long long int64;
typedef unsigned 
long long uint64;

const int kMaxn(50007);

struct Node
{
    
int a,b;
    
int max,lmax,rmax;
    
bool cover;
};

int n,m;
Node tree[kMaxn
<<2];

void Build(int node,int x,int y)
{
    tree[node].a
=x;
    tree[node].b
=y;
    tree[node].max
=tree[node].lmax=tree[node].rmax=y-x+1;
    tree[node].cover
=false;
    
if(x<y)
    {
        
int m(Half(x+y));
        Build(L(node),x,m);
        Build(R(node),m
+1,y);
    }
}

void PushDown(int node)
{
    
if(!tree[node].cover)
        
return;
    tree[node].cover
=false;
    tree[L(node)].cover
=tree[R(node)].cover=true;
    
if(tree[node].max)
    {
        tree[L(node)].max
=tree[L(node)].lmax=tree[L(node)].rmax=tree[L(node)].b-tree[L(node)].a+1;
        tree[R(node)].max
=tree[R(node)].lmax=tree[R(node)].rmax=tree[R(node)].b-tree[R(node)].a+1;
    }
    
else
    {
        tree[L(node)].max
=tree[L(node)].lmax=tree[L(node)].rmax=0;
        tree[R(node)].max
=tree[R(node)].lmax=tree[R(node)].rmax=0;
    }
}

void PushUp(int node)
{
    tree[node].max
=max(tree[L(node)].max,tree[R(node)].max);
    tree[node].max
=max(tree[node].max,tree[L(node)].rmax+tree[R(node)].lmax);
    
if(tree[L(node)].max==tree[L(node)].b-tree[L(node)].a+1)
        tree[node].lmax
=tree[L(node)].max+tree[R(node)].lmax;
    
else
        tree[node].lmax
=tree[L(node)].lmax;
    
if(tree[R(node)].max==tree[R(node)].b-tree[R(node)].a+1)
        tree[node].rmax
=tree[L(node)].rmax+tree[R(node)].max;
    
else
        tree[node].rmax
=tree[R(node)].rmax;
}

void Modify(int node,int x,int y,int sign)
{
    
int len(tree[node].b-tree[node].a+1);
    
if(x<=tree[node].a && tree[node].b<=y)
    {
        tree[node].cover
=true;
        
if(sign==0)
            tree[node].max
=0;
        
else
            tree[node].max
=len;
        tree[node].lmax
=tree[node].rmax=tree[node].max;
        
return;
    }
    PushDown(node);
    
int m(Half(tree[node].a+tree[node].b));
    
if(m>=x)
        Modify(L(node),x,y,sign);
    
if(m<y)
        Modify(R(node),x,y,sign);
    PushUp(node);
}

int Query(int node,int need)
{
    
if(tree[node].max<need)
        
return 0;
    
if(tree[node].a==tree[node].b)
        
return tree[node].a;
    PushDown(node);
    
if(tree[node].lmax>=need)
        
return tree[node].a;
    
if(tree[L(node)].max>=need)
        
return Query(L(node),need);
    
if(tree[L(node)].rmax+tree[R(node)].lmax>=need)
        
return tree[L(node)].b-tree[L(node)].rmax+1;
    
return Query(R(node),need);
}

int main()
{
    
//freopen("data.in","r",stdin);
    
    
while(scanf("%d%d",&n,&m)==2)
    {
        Build(
1,1,n);
        
        
while(m--)
        {
            
int cmd;
            scanf(
"%d",&cmd);
            
if(cmd==1)
            {
                
int a,result;
                scanf(
"%d",&a);
                result
=Query(1,a);
                printf(
"%d\n",result);
                
if(result)
                    Modify(
1,result,result+a-1,0);
            }
            
else
            {
                
int a,b;
                scanf(
"%d%d",&a,&b);
                Modify(
1,a,a+b-1,1);
            }
        }
    }
    
    
return 0;
}
posted on 2011-08-17 20:02 lee1r 阅读(608) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:数据结构

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理