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

 

你可能感兴趣的:(HDU)