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;
}
HDU 3308 LCIS 线段树 PushUp应用
最新推荐文章于 2024-07-20 21:43:30 发布
