您的位置:首页 > 其它

Poj 1823 Hotel (线段树 区间合并 成段更新)

2013-08-09 19:44 281 查看
题目

注意更新的范围是[i,M+i-1];

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 16100
inline int input()
{
    int ret=0;
    char c;
    c=getchar();
    while(c<'0'||c>'9')
    {
        c=getchar();
    }
    while(c>='0'&&c<='9') 
    {
        ret=ret*10+c-'0';
        c=getchar();
    }
    return ret;
}
struct node
{
    int l,r,lazy;
    int lsum1,rsum1,lsum0,rsum0,msum1,msum0;
}root[N*6];

inline void Pushup(int t)
{
    int ll=root[t*2].r-root[t*2].l+1;
    int lr=root[t*2+1].r-root[t*2+1].l+1;
    root[t].lsum1=root[t*2].lsum1+(root[t*2].lsum1==ll?root[t*2+1].lsum1:0);
    root[t].lsum0=root[t*2].lsum0+(root[t*2].lsum0==ll?root[t*2+1].lsum0:0);
    root[t].rsum1=root[t*2+1].rsum1+(root[t*2+1].rsum1==lr?root[t*2].rsum1:0);
    root[t].rsum0=root[t*2+1].rsum0+(root[t*2+1].rsum0==lr?root[t*2].rsum0:0);
    root[t].msum0=max(max(root[t*2].msum0,root[t*2+1].msum0),root[t*2].rsum0+root[t*2+1].lsum0);
    root[t].msum1=max(max(root[t*2].msum1,root[t*2+1].msum1),root[t*2].rsum1+root[t*2+1].lsum1);
}
inline void Pushdown(int t)
{
    if(root[t].lazy!=-1)
    {
        int ll=root[t*2].r-root[t*2].l+1;
        int lr=root[t*2+1].r-root[t*2+1].l+1;
        root[t*2].lazy=root[t*2+1].lazy=root[t].lazy;
        root[t*2].lsum0=root[t*2].rsum0=root[t*2].msum0=(root[t].lazy==0?ll:0);
        root[t*2].lsum1=root[t*2].rsum1=root[t*2].msum1=(root[t].lazy==0?0:ll);
        root[t*2+1].lsum0=root[t*2+1].rsum0=root[t*2+1].msum0=(root[t].lazy==0?lr:0);
        root[t*2+1].lsum1=root[t*2+1].rsum1=root[t*2+1].msum1=(root[t].lazy==0?0:lr);
        root[t].lazy=-1;
    }
}

inline void build(int t,int x,int y)
{
    root[t].l=x;
    root[t].r=y;
    root[t].lazy=-1;
    if(x==y)
    {
        root[t].msum0=root[t].lsum0=root[t].rsum0=1;
        root[t].msum1=root[t].lsum1=root[t].rsum1=0;
        return;
    }
    int m=(x+y)>>1;
    build(t*2,x,m);
    build(t*2+1,m+1,y);
    Pushup(t);
}

inline void Modefiy(int t,int x,int y,int val)
{
    int l=root[t].l;
    int r=root[t].r;
    if(l==x&&y==r)
    {
        int L=root[t].r-root[t].l+1;
        root[t].lazy=val;
        root[t].msum0=root[t].lsum0=root[t].rsum0=(val==0?L:0);
        root[t].msum1=root[t].lsum1=root[t].rsum1=(val==0?0:L);
        return;
    }
    Pushdown(t);
    int  m=(l+r)>>1;
    if(x<=m) Modefiy(t*2,x,min(m,y),val);
    if(y>m) Modefiy(t*2+1,max(m+1,x),y,val);
    Pushup(t);
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        build(1,1,n);
        int p=input();
        for(int i=1;i<=p;i++)
        {
            int op=input();
            if(op==3)
                printf("%d\n",root[1].msum0);
            else if(op==1)
            {
                int x=input(),y=input();
                Modefiy(1,x,x+y-1,1);
            }
            else if(op==2)
            {
                int x=input(),y=input();
                Modefiy(1,x,x+y-1,0);
            }
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: