HDU 3308 LCIS(线段树)

题目链接

模板题吧,忘了好多,终于A了...

#include <cstring>
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define maxn 1000000
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct node
{
    int lis,ris,smax,lnum,rnum;
} p[4*maxn];
void pushup(int rt,int l,int r)
{
    int m;
    m = (l + r) >>1;
    p[rt].smax = max(p[rt<<1].smax,p[rt<<1|1].smax);
    if(p[rt<<1].rnum < p[rt<<1|1].lnum)
    {
        p[rt].smax = max(p[rt].smax,p[rt<<1].ris+p[rt<<1|1].lis);
        if(p[rt<<1].lis == p[rt<<1].ris&&p[rt<<1].lis == m-l+1)//少写了个判断...
        p[rt].lis = p[rt<<1].lis + p[rt<<1|1].lis;
        else
        p[rt].lis = p[rt<<1].lis;
        if(p[rt<<1|1].lis == p[rt<<1|1].ris&&p[rt<<1|1].lis == r-m)
        p[rt].ris = p[rt<<1].ris + p[rt<<1|1].ris;
        else
        p[rt].ris = p[rt<<1|1].ris;
    }
    else
    {
        p[rt].lis = p[rt<<1].lis;
        p[rt].ris = p[rt<<1|1].ris;
    }
    p[rt].lnum = p[rt<<1].lnum;
    p[rt].rnum = p[rt<<1|1].rnum;
}
void build(int l,int r,int rt)
{
    int m;
    if(l == r)
    {
        scanf("%d",&p[rt].lnum);
        p[rt].rnum = p[rt].lnum;
        p[rt].smax = 1;
        p[rt].ris = 1;
        p[rt].lis = 1;
        return ;
    }
    m = (l + r) >> 1;
    build(lson);
    build(rson);
    pushup(rt,l,r);
}
void update(int x,int sc,int l,int r,int rt)
{
    int m;
    if(l == x&&r == x)
    {
        p[rt].lnum = sc;
        p[rt].rnum = sc;
        p[rt].smax = 1;
        p[rt].lis = 1;
        p[rt].ris = 1;
        return ;
    }
    m = (l + r)>>1;
    if(x <= m)
    update(x,sc,lson);
    else
    update(x,sc,rson);
    pushup(rt,l,r);
}
int query(int L,int R,int l,int r,int rt)
{
    int m,ans,s1,s2;
    if(l >= L&&r <= R)
    {
        return p[rt].smax;
    }
    m = (l + r)>>1;
    if(L > m)
    return query(L,R,rson);
    if(R <= m)
    return query(L,R,lson);
    ans = max(query(L,R,lson),query(L,R,rson));
    if(p[rt<<1].rnum < p[rt<<1|1].lnum)
    {
        s1 = min(m-L+1,p[rt<<1].ris);
        s2 = min(R-m,p[rt<<1|1].lis);
        ans = max(s1+s2,ans);
    }
    return ans;
}
int main()
{
    int t,i,n,m,a,b;
    scanf("%d",&t);
    char str[10];
    while(t--)
    {
        scanf("%d%d",&n,&m);
        build(0,n-1,1);
        for(i = 0; i < m; i ++)
        {
            scanf("%s%d%d",str,&a,&b);
            if(str[0] == 'Q')
            {
                printf("%d\n",query(a,b,0,n-1,1));
            }
            else
            {
                update(a,b,0,n-1,1);
            }
        }
    }
    return 0;
}
View Code

 

posted @ 2014-05-02 14:58  Naix_x  阅读(152)  评论(0编辑  收藏  举报