zoukankan      html  css  js  c++  java
  • 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
    ",query(a,b,0,n-1,1));
                }
                else
                {
                    update(a,b,0,n-1,1);
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    SpringFramework中的BeanWrapper丶PropertyEditor
    Spring加载资源文件的方式
    kettle批量导入json数据
    Beanfactory与ApplicationContext
    fastjson的方法应用与java JSONObject
    算法 汽水瓶
    算法 简单密码
    算法 识别有效ip地址和掩码并做统计
    各类IP地址
    算法 密码验证合格程序
  • 原文地址:https://www.cnblogs.com/naix-x/p/3704058.html
Copyright © 2011-2022 走看看