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] 区间最优值
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; }
相关文章推荐
- [HDU 3308]LCIS[线段树][区间合并]
- [HDU 3308] LCIS
- hdu 3308 LCIS
- hdu 3308 LCIS (线段树)
- HDU 3308 LCIS
- HDU 3308 LCIS (线段树)
- HDU-3308-LCIS
- HDU 3308 LCIS
- HDU 3308 LCIS
- 【线段树】HDU 3308 LCIS
- hdu(3308)LCIS
- HDU 3308 LCIS(线段树)
- hdu 3308 LCIS(线段树,测试数据好坑!)
- HDU 3308 LCIS (线段树~)
- 【线段树】HDU 3308 LCIS
- HDU 3308 LCIS
- hdu 3308 LCIS
- HDU 3308 LCIS(线段树区间合并)
- hdu-3308-LCIS 线段树
- Hdu 3308 LCIS