您的位置:首页 > 其它

HDU 3308 LCIS

2012-09-25 23:39 260 查看
题意:Given n integers.
You have two operations:
U A B: replace the Ath number by B. (index counting from 0)
Q A B: output the length of the longest consecutive increasing subsequence (LCIS) in [a, b].

分析:区间合并类线段树。

las[maxn<<2] 区间左端起最长的序列长度
ras[maxn<<2] 区间右端起最长的序列长度
mov[maxn<<2] 区间最优值

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 100005
#define clr(x)memset(x,0,sizeof(x))
int max(int a,int b){
return a>b?a:b;
}
int min(int a,int b){
return a<b?a:b;
}
int las[maxn<<2];
int ras[maxn<<2];
int mov[maxn<<2];
int va[maxn<<2];
void pushup(int l,int r,int mid,int rt)
{
las[rt]=las[rt<<1];
ras[rt]=ras[rt<<1|1];
mov[rt]=0;
if(va[mid]<va[mid+1])
{
mov[rt]=ras[rt<<1]+las[rt<<1|1];
if(las[rt<<1]==mid-l+1)
las[rt]+=las[rt<<1|1];
if(ras[rt<<1|1]==r-mid)
ras[rt]+=ras[rt<<1];
}
mov[rt]=max(mov[rt],max(mov[rt<<1],mov[rt<<1|1]));
}
void creat(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&va[l]);
las[rt]=ras[rt]=1;
mov[rt]=1;
return;
}
int mid=(l+r)>>1;
creat(l,mid,rt<<1);
creat(mid+1,r,rt<<1|1);
pushup(l,r,mid,rt);
}
void update(int pos,int val,int l,int r,int rt)
{
if(l==r)
{
va[l]=val;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)
update(pos,val,l,mid,rt<<1);
else update(pos,val,mid+1,r,rt<<1|1);
pushup(l,r,mid,rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
return mov[rt];
int mid=(l+r)>>1;
int res=0;
if(R <= mid)
return query(L,R,l,mid,rt<<1);
else if(L>mid)
return query(L,R,mid+1,r,rt<<1|1);
else
{
int tmp=0;
if(va[mid]<va[mid+1])
tmp=min(ras[rt<<1],mid-L+1)+min(las[rt<<1|1],R-mid);
int t1=query(L,R,l,mid,rt<<1);
int t2=query(L,R,mid+1,r,rt<<1|1);
res=max(t1,t2);
return max(res,tmp);
}
return res;
}
int main()
{
char op[2];
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
creat(1,n,1);
while(m--)
{
int a,b;
scanf("%s%d%d",op,&a,&b);
if(op[0]=='Q')
printf("%d\n",query(a+1,b+1,1,n,1));
else
update(a+1,b,1,n,1);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: