题意:

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 线段树 最长连续上升子序列 单点更新 区间查询的更多相关文章

  1. HDU 3308 线段树求区间最长连续上升子序列长度

    题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...

  2. hdu 3308(线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. hdu 3308 线段树

    题目大意:给n个数,两种操作1:U  a b   更新第a个为b (从0开始)2: Q    a ,b  查询 a,b之间LCIS(最长连续递增子序列)的长度. Sample Input110 107 ...

  4. HDU 3308 线段树单点更新+区间查找最长连续子序列

    LCIS                                                              Time Limit: 6000/2000 MS (Java/Oth ...

  5. hdu 3308 线段树,单点更新 求最长连续上升序列长度

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. hdu 3308 线段树 区间合并+单点更新+区间查询

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. hdu 1166 线段树(sum+单点修改)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

随机推荐

  1. 将Vim改造为强大的IDE

    1.安装Vim和Vim基本插件 首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可: lingd@ubuntu:~/arm$sudo apt-get install vim vim-s ...

  2. python之函数式编程

    python提供了支持函数式编程的简单机制: 1. map函数 2. filter函数 3. reduce函数. 典型的M/R计算模型. 但还是有点简单...

  3. MVC 删除文件

    protected void DeleteTempFiles(string iFileName) { FileInfo f = new FileInfo(iFileName); DirectoryIn ...

  4. MVC学习系列——ModelBinder扩展

    在MVC系统中,我们接受数据,运用的是ModelBinder 的技术. MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果. 那么是不是意味着能POS ...

  5. mysql left( right ) join使用on 与where 筛选的差异

    有这样的一个问题mysql查询使用mysql中left(right)join筛选条件在on与where查询出的数据是否有差异. 可能只看着两个关键字看不出任何的问题.那我们使用实际的例子来说到底有没有 ...

  6. 【学习总结】声明变量在@interface括号中与使用@property的区别

    方式一:直接在.h文件@interface中的大括号中声明. @interface Test : NSObject { NSString *str; // 私有变量 , 其他类无法访问,只能够该类内部 ...

  7. dbutils报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表

    今天用dbutils操作数据库,莫名地报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表 检查了sql语句没有问题.经过仔细排查 ...

  8. 2729:[HNOI2012]排队 - BZOJ

    题目描述 Description某中学有n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人 ...

  9. SVN--VisualSVN server 服务端和 TortoiseSVN客户端的基础使用

    前言 在上一文http://www.cnblogs.com/wql025/p/5177699.html中,我们讲到了使用SVN的第一步,即下载.安装SVN的服务端软件--VisualSVN serve ...

  10. JNI中使用cl命令生成DLL文件

    问题描述:     在使用JNI调用DLL时,首先需要生成DLL文件 问题解决:     (1)现在使用VS2008的cl.exe程序,生成DLL文件 (1.1)cl.exe环境搭建 注:   cl. ...