zoukankan      html  css  js  c++  java
  • HDU 3308 LCIS 线段树 单点更新+区间合并

    感觉区间合并都一个样,没什么好说的。

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    #define pb(a) push_back(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c) {
        return min(min(a,b),min(a,c));
    }
    template<class T> T max(const T& a,const T& b,const T& c) {
        return max(max(a,b),max(a,c));
    }
    void debug() {
    #ifdef ONLINE_JUDGE
    #else
    
        freopen("d:\in.txt","r",stdin);
        freopen("d:\out1.txt","w",stdout);
    #endif
    }
    int getch() {
        int ch;
        while((ch=getchar())!=EOF) {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    const int MAXN=100100;
    struct node
    {
        int maxx,pre,suf,lv,rv,len;
    };
    node tree[MAXN<<2];
    void Merge(node &fa,node &l,node &r)
    {
        fa.len=l.len+r.len;
        fa.maxx=max(l.maxx,r.maxx,r.lv>l.rv?l.suf+r.pre:-1);
        fa.lv=l.lv;fa.rv=r.rv;
        fa.pre=l.pre==l.len&&l.rv<r.lv?l.pre+r.pre:l.pre;
        fa.suf=r.suf==r.len&&l.rv<r.lv?r.suf+l.suf:r.suf;
    }
    int build(int idx,int l,int r)
    {
        if(l==r)
        {
            int v;
            scanf("%d",&v);
            node &x=tree[idx];
            x.len=x.pre=x.suf=x.maxx=1;
            x.lv=x.rv=v;
            return 0;
        }
        int mid=(r+l)>>1;
        build(lson);
        build(rson);
        Merge(tree[idx],tree[idx<<1],tree[idx<<1|1]);
        return 0;
    }
    int update(int idx,int l,int r,int x,int v)
    {
        if(l==r)
        {
            tree[idx].lv=tree[idx].rv=v;
            return 0;
        }
        int mid=(r+l)>>1;
        if(x<=mid)update(lson,x,v);
        else update(rson,x,v);
        Merge(tree[idx],tree[idx<<1],tree[idx<<1|1]);
        return 0;
    }
    node query(int idx,int l,int r,int tl,int tr)
    {
        if(tl<=l&&tr>=r)
            return tree[idx];
        int mid=(r+l)>>1;
        if(tl<=mid&&tr>mid)
        {
            node q,a,b;
            a=query(lson,tl,tr);
            b=query(rson,tl,tr);
            Merge(q,a,b);
            return q;
        }else if(tl<=mid)
            return query(lson,tl,tr);
            else return  query(rson,tl,tr);
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        for(int ca=1;ca<=t;ca++)
        {
            int n,m;
            scanf("%d%d",&n,&m);
            build(1,0,n-1);
            for(int i=1;i<=m;i++)
            {
                char op=getch();
                if(op=='Q')
                {
                    int a,b;
                    scanf("%d%d",&a,&b);
                    node q=query(1,0,n-1,a,b);
                    printf("%d
    ",q.maxx);
                }else
                {
                    int x,v;
                    scanf("%d%d",&x,&v);
                    update(1,0,n-1,x,v);
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    [SDOI2009]生日礼物(单调队列)
    [luogu1638]逛画展(单调队列)
    【最短路】·SPFA算法实现
    [UVA10474]大理石在哪儿
    【转载】C++中string erase函数的使用
    【转载】高精度减法的OP写法
    【转载】ST表
    串门赛: NOIP2016模拟赛——By Marvolo 丢脸记
    Bzoj 3813 奇数国 题解 数论+线段树+状压
    Bzoj 2064 分裂 题解
  • 原文地址:https://www.cnblogs.com/BMan/p/3295781.html
Copyright © 2011-2022 走看看