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

Sample Input
1
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
Sample Output

1
1
4
2
3
1
2
5

 #include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 100005
using namespace std; int mlen[maxn<<],lmlen[maxn<<],rmlen[maxn<<];
int num[maxn]; void pushup(int rt,int l,int r)
{
lmlen[rt]=lmlen[rt<<];
rmlen[rt]=rmlen[rt<<|];
mlen[rt]=max(mlen[rt<<],mlen[rt<<|]);
int mid=(l+r)>>;
int m=(r-l)+;
if(num[mid]<num[mid+]) //左区间的右值小于右区间的左值可以合并
{
if(lmlen[rt]==m-(m>>)) lmlen[rt]+=lmlen[rt<<|];
if(rmlen[rt]==(m>>)) rmlen[rt]+=rmlen[rt<<];
mlen[rt]=max(mlen[rt],lmlen[rt<<|]+rmlen[rt<<]);
}
}
void build(int l,int r,int rt)
{
if(l==r)
{
mlen[rt]=lmlen[rt]=rmlen[rt]=;
return ;
}
int m=(l+r)>>;
build(lson);
build(rson);
pushup(rt,l,r);
}
void update(int a,int l,int r,int rt)
{
if(l==r)
{
return;
}
int m=(l+r)>>;
if(a<=m) update(a,lson);
else update(a,rson);
pushup(rt,l,r);
} int query(int L,int R,int l,int r,int rt)
{
//printf("%d %d %d %d %d\n",L,R,l,r,rt);
if(L<=l&&r<=R)
{
return mlen[rt];
}
int m=(l+r)>>;
if(R<=m) return query(L,R,lson); //与一般不同,不能是子集,只能全部属于才能直接查询子区间 返回子区间的mlen
if(L>m) return query(L,R,rson); //否则是确认儿子区间是否能合并,并在三者之间取最大值 int ta,tb;
ta=query(L,R,lson);
tb=query(L,R,rson);
int ans;
ans=max(ta,tb);
if(num[m]<num[m+]) //同上
{
int temp;
temp=min(rmlen[rt<<],m-L+)+min(lmlen[rt<<|],R-m);
ans=max(temp,ans);
}
return ans;
} int main()
{
int T,n,m;
int i,j;
char f[];
int a,b;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d",&T);
for(i=;i<T;i++)
{
scanf("%d %d",&n,&m);
for(j=;j<=n;j++)
scanf("%d",&num[j]);
build(,n,);
while(m--)
{
scanf("%s",&f);
if(f[]=='U')
{
scanf("%d %d",&a,&b);
a++;
num[a]=b;
update(a,,n,);
}
else
{
scanf("%d %d",&a,&b);
a++,b++;
printf("%d\n",query(a,b,,n,));
}
}
}
return ;
}

hdu 3308 线段树的更多相关文章

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

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

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

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

  3. HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询

    题意: T个测试数据 n个数 q个查询 n个数 ( 下标从0开始) Q u v 查询 [u, v ] 区间最长连续上升子序列 U u v 把u位置改成v #include<iostream> ...

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

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

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

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

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

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

  7. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  8. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

随机推荐

  1. 【CTF WEB】GCTF-2017读文件

    读文件 只给了个1.txt可以读,试了一下加*不行,感觉不是命令执行,"../"返回上级目录也不行,猜测可能过滤了什么,在1.txt中间加上"./"发现仍能读取 ...

  2. ARM Linux 3.x的设备树(Device Tree)【转】

    转自:http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1.  ...

  3. 使用nginx sticky实现基于cookie的负载均衡【转】

    在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信,我们势必使用长连接.使用什么方式来实现这种连接呢,常见的有使用nginx自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端 ...

  4. 3->集群架构主机克隆教程

    centos7系统集群主机克隆: 有道笔记链接地址

  5. BigDecimal常用方法

    一.介绍 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteg ...

  6. 27 Debugging Go Code with GDB 使用GDB调试go代码

    Debugging Go Code with GDB  使用GDB调试go代码 Introduction Common Operations Go Extensions Known Issues Tu ...

  7. Python_oldboy_自动化运维之路(八)

    本节内容: 列表生成式,迭代器,生成器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器,生成器 1.列表生成式 #[列表生成] #1.列 ...

  8. 序列化 json和pickle

    序列化 1. 什么叫序列化 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 2.  json dumps loads    一般对字典和列表序列化 dump load       一般对 ...

  9. C++ 必须使用初始化列表

    继承关系中,父类无默认构造函数 类类型类成员变量无默认构造函数 const类型成员变量 引用类型成员变量 不使用初始化列表,在创建对象调用构造函数之前会对所有的成员变量进行默认初始化,然后再执行构造函 ...

  10. 利用sys.dm_db_index_physical_stats查看索引碎片等数据

    我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最 ...