HDU 3308

来源:互联网 发布:winscp网络错误被拒绝 编辑:程序博客网 时间:2024/05/19 22:58

线段树  区间合并

题意:

U A B  把A点的值改为B

Q A B 求区间[A,B]的最长连续递增子序列

分析:

pushup 的时候 ,如果左区间的右值小于右区间的左值,则左右区间可以合并,否则,LCS为左右区间中最长的。





#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define ls rt<<1#define rs rt<<1|1#define N 100005using namespace std;int lv[N<<2];   //区间左端点值int rv[N<<2];   //区间右端点值int lcs[N<<2];  //区间最长连续递增子序列int llcs[N<<2]; //区间左最长连续递增子序列int rlcs[N<<2]; //区间右最长连续递增子序列int len[N<<2];  //区间长度void pushup(int rt){    lv[rt]=lv[ls];    rv[rt]=rv[rs];    llcs[rt]=llcs[ls];    rlcs[rt]=rlcs[rs];    lcs[rt]=max(lcs[ls],lcs[rs]);    if(rv[ls]<lv[rs]){        if(llcs[ls]==len[ls]) //左孩子区间左LCS=区间长度        llcs[rt]+=llcs[rs];        if(rlcs[rs]==len[rs])//右孩子区间右LCS=区间长度        rlcs[rt]+=rlcs[ls];        lcs[rt]=max(lcs[rt],rlcs[ls]+llcs[rs]);    }}void build(int l, int r,int rt){    len[rt]=r-l+1;    if(l==r){        scanf("%d",&lv[rt]);        rv[rt]=lv[rt];        lcs[rt]=1;        llcs[rt]=1;        rlcs[rt]=1;        return ;    }    int m=(l+r)>>1;    build(lson);    build(rson);    pushup(rt);}void update(int x,int y,int l,int r,int rt){    if(l==r){        lv[rt]=rv[rt]=y;        return;    }    int m=(l+r)>>1;    if(x<=m)    update(x,y,lson);    else    update(x,y,rson);    pushup(rt);}int query(int L,int R,int l,int r,int rt){    if(L<=l&&r<=R){        return lcs[rt];    }    int m=(l+r)>>1;    int ret=0;    if(L<=m){        ret=max(ret,query(L,R,lson));    }    if(R>m){        ret=max(ret,query(L,R,rson));    }    if(rv[ls]<lv[rs]){       ret=max(ret,min(m-L+1,rlcs[ls])+min(R-m,llcs[rs]));    }    return ret;}int main(){    int T,Q,x,y,n;    char op[2];    scanf("%d",&T);    while(T--){        scanf("%d%d",&n,&Q);        build(1,n,1);        while(Q--){            scanf("%s",op);            scanf("%d%d",&x,&y);            if(op[0]=='Q'){                printf("%d\n",query(x+1,y+1,1,n,1));            }else {                update(x+1,y,1,n,1);            }        }    }    return 0;}


0 0
原创粉丝点击