HDU 3308 LCIS

题意:Given n integers.
        You have two operations:
        U A B: replace the Ath number by B. (index counting from 0)
        Q A B: output the length of the longest consecutive increasing subsequence (LCIS) in [a, b].

分析:区间合并类线段树。

        las[maxn<<2]     区间左端起最长的序列长度
        ras[maxn<<2]    区间右端起最长的序列长度
        mov[maxn<<2]  区间最优值

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 100005
#define clr(x)memset(x,0,sizeof(x))
int max(int a,int b){
    return a>b?a:b;
}
int min(int a,int b){
    return a<b?a:b;
}
int las[maxn<<2];
int ras[maxn<<2];
int mov[maxn<<2];
int va[maxn<<2];
void pushup(int l,int r,int mid,int rt)
{
    las[rt]=las[rt<<1];
    ras[rt]=ras[rt<<1|1];
    mov[rt]=0;
    if(va[mid]<va[mid+1])
    {
        mov[rt]=ras[rt<<1]+las[rt<<1|1];
        if(las[rt<<1]==mid-l+1)
            las[rt]+=las[rt<<1|1];
        if(ras[rt<<1|1]==r-mid)
            ras[rt]+=ras[rt<<1];
    }
    mov[rt]=max(mov[rt],max(mov[rt<<1],mov[rt<<1|1]));
}
void creat(int l,int r,int rt)
{
    if(l==r)
    {
        scanf("%d",&va[l]);
        las[rt]=ras[rt]=1;
        mov[rt]=1;
        return;
    }
    int mid=(l+r)>>1;
    creat(l,mid,rt<<1);
    creat(mid+1,r,rt<<1|1);
    pushup(l,r,mid,rt);
}
void update(int pos,int val,int l,int r,int rt)
{    
    if(l==r)
    {
       va[l]=val;
       return;
    }
    int mid=(l+r)>>1;
    if(pos<=mid)
         update(pos,val,l,mid,rt<<1);
    else update(pos,val,mid+1,r,rt<<1|1);
    pushup(l,r,mid,rt);
}
int query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&r<=R)
        return mov[rt];
    int mid=(l+r)>>1;
    int res=0;
    if(R <= mid)
        return query(L,R,l,mid,rt<<1);
    else if(L>mid)
        return query(L,R,mid+1,r,rt<<1|1);
    else 
    {
        int tmp=0;
        if(va[mid]<va[mid+1])
            tmp=min(ras[rt<<1],mid-L+1)+min(las[rt<<1|1],R-mid);
        int t1=query(L,R,l,mid,rt<<1);
        int t2=query(L,R,mid+1,r,rt<<1|1);
        res=max(t1,t2);
        return max(res,tmp);
    }
    return res;
}
int main()
{    
    char op[2];
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        creat(1,n,1);
        while(m--)
        {
            int a,b;
            scanf("%s%d%d",op,&a,&b);
            if(op[0]=='Q')
                printf("%d\n",query(a+1,b+1,1,n,1));
            else 
                update(a+1,b,1,n,1);
        }    
    }
    return 0;
}

 

 

posted @ 2012-09-25 23:39  'wind  阅读(149)  评论(0编辑  收藏  举报