HDOJ 3308 LCIS (线段树之区间合并)
来源:互联网 发布:藏书羊肉的木桶淘宝 编辑:程序博客网 时间:2024/05/17 23:10
LCIS
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7349 Accepted Submission(s): 3110
Problem Description
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].
Input
T in the first line, indicating the case number.
Each case starts with two integers n , m(0<n,m<=105).
The next line has n integers(0<=val<=105).
The next m lines each has an operation:
U A B(0<=A,n , 0<=B=105)
OR
Q A B(0<=A<=B< n).
Output
For each Q, output the answer.
Sample Input
110 107 7 3 3 5 9 9 8 1 8 Q 6 6U 3 4Q 0 1Q 0 5Q 4 7Q 3 5Q 0 2Q 4 6U 6 10Q 0 9
Sample Output
11423125
#include <bits/stdc++.h>using namespace std;#define mst(a,b) memset((a),(b),sizeof(a))#define f(i,a,b) for(int i=(a);i<(b);++i)const int maxn =10005;const int mod = 10005;const int INF = 1e9;#define ll long long#define m ((l+r)>>1)#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define rush() int T;scanf("%d",&T);while(T--)int msum[maxn<<2]; //区间内最长连续递增子序列长度. int lsum[maxn<<2]; //从第一个数开始算起 到a[m]的最大连续递增序列长度int rsum[maxn<<2]; //从a[m+1]开始算起 到最后一个数的最大连续递增序列长度int num[maxn];void pushup(int l,int r,int rt){ lsum[rt]=lsum[rt*2]; rsum[rt]=rsum[rt*2+1]; msum[rt]=max(msum[rt*2],msum[rt*2+1]); int len=r-l+1; if(num[m]<num[m+1]) { if(lsum[rt]==len-(len/2)) lsum[rt]+=lsum[rt*2+1]; if(rsum[rt]==len/2) rsum[rt]+=rsum[rt*2]; msum[rt]=max(msum[rt],lsum[rt*2+1]+rsum[rt*2]); }}void build(int l,int r,int rt){ if(l==r) { msum[rt]=lsum[rt]=rsum[rt]=1; return ; } build(lson); build(rson); pushup(l,r,rt) ;}void update(int p,int l,int r,int rt){ if(l==r) return; if(p<=m) update(p,lson); else update(p,rson); pushup(l,r,rt);}int query(int x,int y,int l,int r,int rt){ if(x<=l&&r<=y) { return msum[rt]; } if(y<=m) return query(x,y,lson); if(x>m) return query(x,y,rson); int a,b; a=query(x,y,lson); b=query(x,y,rson); int ans; ans=max(a,b); if(num[m]<num[m+1]) //区间合并 { int c; c=min(rsum[rt*2],m-x+1)+min(lsum[rt*2+1],y-m);//防炸 ans=max(c,ans); } return ans;}int main(){ int t; scanf("%d",&t); while(t--) { int n,M; mst(lsum,0),mst(rsum,0),mst(msum,0),mst(num,0); scanf("%d%d",&n,&M); f(i,1,n) { scanf("%d",&num[i]); } build(1,n,1); while(M--) { char ch[2]; scanf("%s",ch); int a,b; scanf("%d%d",&a,&b); if(ch[0]=='U') { a++; num[a]=b; update(a,1,n,1); } else { a++,b++; printf("%d\n",query(a,b,1,n,1)); } } } return 0;}
0 0
- HDOJ 3308 LCIS (线段树之区间合并)
- HDOJ 3308 LCIS (线段树区间合并)
- HDOJ 题目3308 LCIS(线段树,区间查询,区间合并)
- HDU OJ 3308 LCIS 【线段树之区间合并】
- hdu 3308 LCIS 线段树 区间合并
- hdu 3308LCIS 线段树 区间合并
- [HDU 3308]LCIS[线段树][区间合并]
- hdu 3308 LCIS(线段树区间合并)
- HDU 3308 LCIS 线段树区间合并
- HDU 3308 LCIS(线段树区间合并)
- HUD-3308 LCIS 线段树(区间合并)
- HDU3308 LCIS(线段树区间合并)
- hdu 3308 LCIS (线段树+单点更新+区间合并)
- 【HDU】3308 LCIS (线段树-区间合并)
- HDU 3308 LCIS(线段树区间合并)
- HDU - 3308 - LCIS (线段树 - 区间合并)
- HDU 3308 LCIS(线段树区间合并)
- HDU 3308 LCIS(线段树区间合并 单点更新)
- 【C++学习笔记】列表初始化规则
- linux编译安装mysql
- 蓝桥杯-组合公式求值(java)
- Window之删除云盘在设备和驱动器上的图标
- 基于bootstrap modal进行添加 修改,调用赋值
- HDOJ 3308 LCIS (线段树之区间合并)
- intent详解(一)
- django 1.10.6 admin后台管理设置显示中文
- X I N的开始
- 开发CTP自动化交易日志
- 字符串和数字相互转换
- 快乐司机 C语言
- intent详解(二)
- 蓝桥杯-用宏求球的体积(java)