HDU3308 LCIS 最长连续上升序列。
来源:互联网 发布:模拟器软件闪退 编辑:程序博客网 时间:2024/06/05 06:14
询问区间内最大的LCIS
我们需要记录包含最左点的LCIS ,包含最右点的LCIS,和这段的最长LCIS,然后向上更新就没了!
#include<stdio.h>#include<string.h>#include<math.h>#include<queue>#include<vector>#include<iostream>#include<string>#include<set>#include<map>#include<algorithm>using namespace std;#pragma comment(linker, "/STACK:1024000000,1024000000")#define nn 100010#define LL long long#define ULL unsiged long long#define mod 0x7fffffff#define inf oxfffffffffff#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1int a[nn];struct node{ int ln,rn,len;}tree[nn<<2];void pushup(int l,int r,int rt){ int mid=(l+r)>>1; tree[rt].len=max(tree[rt<<1].len,tree[rt<<1|1].len); tree[rt].ln=tree[rt<<1].ln; tree[rt].rn=tree[rt<<1|1].rn; if(a[mid]<a[mid+1]) { if(tree[rt].ln==(mid-l+1)) tree[rt].ln+=tree[rt<<1|1].ln; if(tree[rt].rn==(r-mid)) tree[rt].rn+=tree[rt<<1].rn; tree[rt].len=max(tree[rt].len,tree[rt<<1].rn+tree[rt<<1|1].ln); } //tree[rt].len=max(tree[rt].len,max(tree[rt].ln,tree[rt].rn));}void build(int l,int r,int rt){ if(l==r) { tree[rt].ln=1; tree[rt].len=1; tree[rt].rn=1; return;//你妹的 } int mid=(l+r)>>1; build(lson); build(rson); pushup(l,r,rt);}void updata(int ll,int v,int l,int r,int rt){ if(l==r) { a[ll]=v; return; } int mid=(l+r)>>1; if(ll<=mid) updata(ll,v,lson); else updata(ll,v,rson); pushup(l,r,rt);}int query(int ll,int rr,int l,int r,int rt){ int ans=0; if(ll<=l && rr>=r) return tree[rt].len; int mid=(l+r)>>1; if(ll<=mid) ans=max(ans,query(ll,rr,lson)); if(rr>mid) ans=max(ans,query(ll,rr,rson)); if(a[mid]<a[mid+1]) { if(ll<=mid && mid<rr) ans=max(ans,min(mid-ll+1,tree[rt<<1].rn)+min(rr-mid,tree[rt<<1|1].ln)); } return ans;}int main(){ int t,n,m; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&a[i]); build(0,n-1,1); while(m--) { char ch[2]; int x,y; scanf("%s%d%d",ch,&x,&y); if(ch[0]=='U') updata(x,y,0,n-1,1); else { int ans=query(x,y,0,n-1,1); printf("%d\n",ans); } } } return 0;}
0 0
- HDU3308 LCIS 最长连续上升序列。
- hdu3308 LCIS--区间更新 & 最长连续上升子序列
- HDU 3308 LCIS(最长连续上升子序列)
- HDU 3308 LCIS(最长连续上升子序列)(线段树区间合并)
- hdu5902 GCD is Funny(错) && hdu5904 LCIS(最长公共连续上升子序列)
- 最长公共上升子序列(LCIS)
- [DP]最长公共上升子序列LCIS
- 最长公共上升子序列 LCIS
- 最长公共上升子序列LCIS
- 最长公共上升子序列 LCIS
- 最长上升公共子序列(LCIS)
- Codevs_P2185 最长公共上升子序列(LCIS)
- P1071 LCIS 最长公共上升子序列
- 最长公共上升子序列LCIS
- 最长公共上升子序列LCIS
- LCIS 最长上升公共子序列
- 最长公共上升子序列 LCIS
- 最长上升连续子序列
- 容斥定理 hdu2204 Eddy's爱好
- android手机型号等信息
- 在Activity中得到新打开Activity 关闭后返回的数据
- hdu-2112 HDU Today
- ACM-数学知识的算法应用
- HDU3308 LCIS 最长连续上升序列。
- Java出局游戏
- HandlerThread 的用法 和Thread 的区别
- HDU 2063 过山车( 最大匹配 )
- 32位与64位平台
- poj 2528(区间修改+离散化)
- Executor
- VIM命令集合
- java贪吃蛇