HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询
题意:
T个测试数据
n个数 q个查询
n个数 ( 下标从0开始)
Q u v 查询 [u, v ] 区间最长连续上升子序列
U u v 把u位置改成v
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- #define N 101010
- #define L(x) (x<<1)
- #define R(x) (x<<1|1)
- inline int Max(int a,int b){return a>b?a:b;}
- inline int Min(int a,int b){return a<b?a:b;}
- struct node
- {
- int l,r;
- int mid(){ return (l+r)>>1; }
- int len(){ return r-l+1; }
- int Llen, Rlen, maxlen;
- }tree[4*N];
- int a[N];
- void updata_up(int id){
- tree[id].Llen = tree[L(id)].Llen;
- tree[id].Rlen = tree[R(id)].Rlen;
- tree[id].maxlen = Max( tree[L(id)].maxlen, tree[R(id)].maxlen);
- if( a[ tree[L(id)].r ] < a[ tree[R(id)].l ] )
- {
- if( tree[L(id)].Llen == tree[L(id)].len())
- {
- tree[id].Llen += tree[R(id)].Llen;
- tree[id].maxlen = Max( tree[id].maxlen, tree[id].Llen);
- }
- if( tree[R(id)].Rlen == tree[R(id)].len() )
- {
- tree[id].Rlen += tree[L(id)].Rlen;
- tree[id].maxlen = Max( tree[id].maxlen, tree[id].Rlen);
- }
- tree[id].maxlen = Max( tree[id].maxlen, tree[L(id)].Rlen + tree[R(id)].Llen );
- }
- }
- void build(int l, int r, int id){
- tree[id].l = l, tree[id].r = r;
- if(l==r){ tree[id].Llen = tree[id].Rlen = tree[id].maxlen =1; return ; }
- int mid = (l+r)>>1;
- build(l, mid, L(id));
- build(mid+1, r, R(id));
- updata_up(id);
- }
- void updata(int pos,int id){
- if(tree[id].l == tree[id].r)return ;
- int mid = tree[id].mid();
- if( pos <= mid ) updata(pos, L(id));
- else updata(pos, R(id));
- updata_up(id);
- }
- int query(int l, int r, int id){
- if( l == tree[id].l && tree[id].r == r)
- return tree[id].maxlen;
- int mid = tree[id].mid();
- if(r <= mid)return query(l, r, L(id));
- else if(mid < l) return query(l, r, R(id));
- int L = query(l, mid, L(id)), R = query(mid+1, r, R(id));
- if( a[mid] < a[mid+1] ){
- int LL = Min( mid - l + 1, tree[L(id)].Rlen);
- int RR = Min( r - mid, tree[R(id)].Llen);
- return Max( Max(L,R), LL+RR);
- }
- else return Max(L, R);
- }
- int main(){
- int T,n,q,i; scanf("%d",&T);
- while(T--){
- scanf("%d %d", &n, &q);
- for(i=1;i<=n;i++)scanf("%d",&a[i]);
- build(1, n, 1);
- while(q--)
- {
- char c = '-';
- while(c!='Q' && c!='U') c = getchar();
- int u,v; scanf("%d %d", &u, &v);
- if(c == 'Q')
- printf("%d\n", query(u+1, v+1, 1));
- else if(c == 'U')
- { a[u+1] = v; updata(u+1, 1); }
- }
- }
- return 0;
- }
- /*
- 99
- 10 10
- 7 7 3 3 5 9 9 8 1 8
- Q 6 6
- U 3 4
- Q 0 1
- Q 0 5
- Q 4 7
- Q 3 5
- Q 0 2
- Q 4 6
- U 6 10
- Q 0 9
- 10 99
- 1 2 3 4 5 6 7 8 9 10
- Q 4 7
- U 0 8
- Q 0 9
- U 8 8
- Q 0 9
- */
HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询的更多相关文章
- HDU 3308 线段树求区间最长连续上升子序列长度
题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...
- hdu 3308(线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 3308 线段树
题目大意:给n个数,两种操作1:U a b 更新第a个为b (从0开始)2: Q a ,b 查询 a,b之间LCIS(最长连续递增子序列)的长度. Sample Input110 107 ...
- HDU 3308 线段树单点更新+区间查找最长连续子序列
LCIS Time Limit: 6000/2000 MS (Java/Oth ...
- hdu 3308 线段树,单点更新 求最长连续上升序列长度
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 3308 线段树 区间合并+单点更新+区间查询
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 1166 线段树(sum+单点修改)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
随机推荐
- CodeForces 478B 第八次比赛 B题
Description n participants of the competition were split into m teams in some manner so that each te ...
- Eclipse 下 opennms 开发环境搭建
1.eclipse3.5或更高版本,并且使用纯净的java版.下载地址:Eclipse for Java Developers. 2.安装需要的插件.通过Help/Install New Softwa ...
- String面试题
//a b c 分别是怎么存储的, a和b a和c分别有什么区别// c和d的区别是什么 String a= "hello";String b= "hello" ...
- 从零开始学ios开发(十七):Storyboards(上)
在开始这章之前,先做个说明,从这篇开始,我所使用的xcode更新成了最新的版本,版本是4.6.1(4H512),如下: 大家可以打开自己电脑上的App Store,然后搜索xcode,第一个出现的就是 ...
- 【UIScrollView】基本方法+基本描述
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(, , , )]; scrollView.backgroundColor = [ ...
- 《C++Primer》复习——with C++11 [4]
考虑到STL的掌握主要靠的是练习,所以对于STL这部分,我把书中的练习都做一遍,加深印象.这些练习是第9.10.11.17章的,分别是顺序容器.泛型算法和关联容器等. ——10月22日 /*----- ...
- arcgis for server 登陆manager失败解决办法
版本是 arcgis for server 10.02 症状 1. manager网页无法打开http://localhost:6080/arcgis/manager/ 2. 查看服务无法启动,启动后 ...
- Luence简单实现2
上一篇是基于内存存储的,这次的例子是基于本地存储索引库. 上一次的代码稍微修改,代码如下: //创建词法分析器 Analyzer analyzer = new StandardAnalyzer(); ...
- Python求算数平方根和约数
一.求算术平方根 a=0 x=int(raw_input('Enter a number:')) if x >= 0: while a*a < x: a = a + 1 if a*a != ...
- html+css学习笔记 [基础1]
---------------------------------------------------------------------------------------------------- ...