HDU 3308 LCIS 线段树 PushUp应用

来源:互联网 发布:房产营销软件下载 编辑:程序博客网 时间:2024/06/11 03:49
http://acm.hdu.edu.cn/showproblem.php?pid=3308#include<bits/stdc++.h>using namespace std;const int MAX=100005;int N,M,A[MAX];struct Node{    int l,r,c;      //l,r - 左右边界 c - 长度    int ln,rn;      //ln,rn - 左右边界的值    int ls,rs,ms;   //ls,rs - 左右区间的最大LCIS ms - 该区间最大LCIS};Node F[MAX*4];void PushUp(int x){    F[x].ls=F[x*2].ls;    F[x].rs=F[x*2+1].rs;    F[x].ln=F[x*2].ln;    F[x].rn=F[x*2+1].rn;    F[x].ms=max(F[x*2].ms,F[x*2+1].ms);    if (F[x*2].rn<F[x*2+1].ln)    {        if (F[x*2].ls==F[x*2].c)            F[x].ls+=F[x*2+1].ls;        if (F[x*2+1].rs==F[x*2+1].c)            F[x].rs+=F[x*2].rs;        F[x].ms=max(F[x].ms,F[x*2].rs+F[x*2+1].ls);    }}void Build(int x,int l,int r){    F[x].l=l,F[x].r=r,F[x].c=r-l+1;    if (l==r)    {        F[x].ln=F[x].rn=A[l];        F[x].ls=F[x].rs=F[x].ms=1;        return;    }    int mid=(F[x].l+F[x].r)/2;    Build(x*2,l,mid);    Build(x*2+1,mid+1,r);    PushUp(x);}void Insert(int x,int a,int b){    if (F[x].l==F[x].r)    {        F[x].ln=F[x].rn=b;        return;    }    int mid=(F[x].l+F[x].r)/2;    if (a<=mid)        Insert(x*2,a,b);    if (a>mid)        Insert(x*2+1,a,b);    PushUp(x);}int Query(int x,int l,int r){    if (l<=F[x].l&&F[x].r<=r)        return F[x].ms;    int mid=(F[x].l+F[x].r)/2;    int Ans=0;    if (l<=mid)        Ans=max(Ans,Query(x*2,l,r));    if (r>mid)        Ans=max(Ans,Query(x*2+1,l,r));    if (F[x*2].rn<F[x*2+1].ln)        Ans=max(Ans,min(mid-l+1,F[x*2].rs)+min(r-mid,F[x*2+1].ls));    return Ans;}int main(){    int T,a,b;    char Str[10];    scanf("%d",&T);    while (T--)    {        scanf("%d%d",&N,&M);        for (int i=1;i<=N;i++)            scanf("%d",&A[i]);        Build(1,1,N);        while (M--)        {            scanf("%s%d%d",Str,&a,&b);            if (Str[0]=='Q')                printf("%d\n",Query(1,a+1,b+1));            else                Insert(1,a+1,b);        }    }    return 0;}
0 0
原创粉丝点击