HDU3308 LCIS 最长连续上升序列。

来源:互联网 发布:模拟器软件闪退 编辑:程序博客网 时间:2024/06/05 06:14
询问区间内最大的LCIS  
我们需要记录包含最左点的LCIS ,包含最右点的LCIS,和这段的最长LCIS,然后向上更新就没了!

#include<stdio.h>#include<string.h>#include<math.h>#include<queue>#include<vector>#include<iostream>#include<string>#include<set>#include<map>#include<algorithm>using namespace std;#pragma comment(linker, "/STACK:1024000000,1024000000")#define nn 100010#define LL long long#define ULL unsiged long long#define mod 0x7fffffff#define inf oxfffffffffff#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1int a[nn];struct node{    int ln,rn,len;}tree[nn<<2];void pushup(int l,int r,int rt){    int mid=(l+r)>>1;    tree[rt].len=max(tree[rt<<1].len,tree[rt<<1|1].len);    tree[rt].ln=tree[rt<<1].ln;    tree[rt].rn=tree[rt<<1|1].rn;    if(a[mid]<a[mid+1])    {        if(tree[rt].ln==(mid-l+1))            tree[rt].ln+=tree[rt<<1|1].ln;        if(tree[rt].rn==(r-mid))            tree[rt].rn+=tree[rt<<1].rn;        tree[rt].len=max(tree[rt].len,tree[rt<<1].rn+tree[rt<<1|1].ln);    }    //tree[rt].len=max(tree[rt].len,max(tree[rt].ln,tree[rt].rn));}void build(int l,int r,int rt){    if(l==r)    {        tree[rt].ln=1;        tree[rt].len=1;        tree[rt].rn=1;        return;//你妹的    }    int mid=(l+r)>>1;    build(lson);    build(rson);    pushup(l,r,rt);}void updata(int ll,int v,int l,int r,int rt){    if(l==r)    {        a[ll]=v;        return;    }    int mid=(l+r)>>1;    if(ll<=mid)        updata(ll,v,lson);    else updata(ll,v,rson);    pushup(l,r,rt);}int query(int ll,int rr,int l,int r,int rt){    int ans=0;    if(ll<=l && rr>=r)        return tree[rt].len;    int mid=(l+r)>>1;    if(ll<=mid)        ans=max(ans,query(ll,rr,lson));    if(rr>mid)        ans=max(ans,query(ll,rr,rson));    if(a[mid]<a[mid+1])    {        if(ll<=mid && mid<rr)            ans=max(ans,min(mid-ll+1,tree[rt<<1].rn)+min(rr-mid,tree[rt<<1|1].ln));    }    return ans;}int main(){    int t,n,m;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        build(0,n-1,1);        while(m--)        {            char ch[2];            int x,y;            scanf("%s%d%d",ch,&x,&y);            if(ch[0]=='U')                updata(x,y,0,n-1,1);            else            {                int ans=query(x,y,0,n-1,1);                printf("%d\n",ans);            }        }    }    return 0;}

0 0
原创粉丝点击