LCIS

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<=10 5).        
The next line has n integers(0<=val<=10 5).        
The next m lines each has an operation:        
U A B(0<=A,n , 0<=B=10 5)        
OR
Q A B(0<=A<=B< n).        
                

Output

For each Q, output the answer.       
                

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
 
题意:求区间[a,b]连续上升的最大区间长度。
解析:线段树维护以下几种信息:左右端点(le,ri),区间长度(len),左端的数(lenum),右端的数(rinum),从左边开始的最大连续上升子序列的长度(lelis),从右边开始的最大上升子序列的长度(rilis),该区间的最大连续上升子序列的长度(maxlen).具体操作见代码。
代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=;
const double eps=0.00000001;
const int maxn=;
struct node
{
int le,ri,len;
int lenum,rinum;
int maxlis,lelis,rilis;
}tree[*maxn];
int elem[maxn];
void pushup(int id)
{
node& fa=tree[id]; //父亲
node& lson=tree[id*]; // 左儿子
node& rson=tree[id*+]; //右儿子
fa.lelis=lson.lelis, fa.rilis=rson.rilis; //更新
fa.lenum=lson.lenum, fa.rinum=rson.rinum;
fa.maxlis=max(lson.maxlis,rson.maxlis); //左右儿子中的最大值
if(lson.rinum<rson.lenum) //如果中间可以形成上升的连续的一段
{
if(lson.lelis==lson.len) fa.lelis+=rson.lelis; //可扩展
if(rson.rilis==rson.len) fa.rilis+=lson.rilis;
fa.maxlis=max(fa.maxlis,lson.rilis+rson.lelis); //最大值更新
}
}
void build_tree(int le,int ri,int id)
{
node& t=tree[id];
t.le=le,t.ri=ri,t.len=ri-le+;
if(le==ri)
{
t.lenum=t.rinum=elem[le];
t.maxlis=t.lelis=t.rilis=;
return;
}
int mid=(le+ri)/;
build_tree(le,mid,id*);
build_tree(mid+,ri,id*+);
pushup(id);
}
int query(int x,int y,int id)
{
if(tree[id].le>=x&&tree[id].ri<=y)
{
return tree[id].maxlis;
}
int mid=(tree[id].le+tree[id].ri)/;
int ret=;
if(x<=mid) ret=max(ret,query(x,y,id*)); //左边
if(y>mid) ret=max(ret,query(x,y,id*+));// 右边
if(tree[id*].rinum<tree[id*+].lenum) ret=max(ret,min(mid-x+,tree[id*].rilis)+min(y-mid,tree[id*+].lelis));//中间
return ret;
}
void update(int id,int pos,int val)
{
if(tree[id].le==tree[id].ri)
{ tree[id].lenum=tree[id].rinum=val; //单点更新
return;
}
int mid=(tree[id].le+tree[id].ri)/;
if(pos<=mid) update(id*,pos,val);
else update(id*+,pos,val);
pushup(id);
}
int main()
{
int T;
cin>>T;
while(T--)
{
int N,M;
cin>>N>>M;
for(int i=;i<=N;i++) scanf("%d",&elem[i]);
build_tree(,N,);
while(M--)
{
char S[];
int from,to;
scanf("%s%d%d",S,&from,&to);
if(S[]=='Q') printf("%d\n",query(from+,to+,));
else update(,from+,to);
}
}
return ;
}
 

HDU 3308 LCIS(线段树单点更新区间合并)的更多相关文章

  1. POJ 2892 Tunnel Warfare(线段树单点更新区间合并)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7876   Accepted: 3259 D ...

  2. hdu1540之线段树单点更新+区间合并

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  3. hdu 5316 Magician(2015多校第三场第1题)线段树单点更新+区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5316 题意:给你n个点,m个操作,每次操作有3个整数t,a,b,t表示操作类型,当t=1时讲a点的值改 ...

  4. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  5. hdu 1166线段树 单点更新 区间求和

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

  6. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  7. POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)

    POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...

  8. hdu1166(线段树单点更新&区间求和模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:中文题诶- 思路:线段树单点更新,区间求和模板 代码: #include <iost ...

  9. hdu 2795 Billboard 线段树单点更新

    Billboard Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=279 ...

随机推荐

  1. Static用法

    一.Static全局变量和全局变量的区别 1)全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式. 这两者在存储 ...

  2. linux find命令-print0和xargs中-0使用技巧(转载)

    本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需要的朋友参考下. 本节内容:linux find命令中-print0和xargs中-0的用法 ...

  3. 判断包含字符String.contains

    Java String.contains()方法用法实例教程, 返回true,当且仅当此字符串包含指定的char值序列 java.lang.String.contains() 方法返回true,当且仅 ...

  4. Ant-进阶

    Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译Linux内核及一些软件的源程序时,经常要用这个命令.Make命令其实 ...

  5. Java并发框架——AQS堵塞队列管理(一)——自旋锁

    我们知道一个线程在尝试获取锁失败后将被堵塞并增加等待队列中,它是一个如何的队列?又是如何管理此队列?这节聊聊CHL Node FIFO队列.  在谈到CHL Node FIFO队列之前,我们先分析这样 ...

  6. 【Struts2】新建一个Struts2工程,初步体验MVC

    实现目标 地址栏输入http://localhost:88/Struts2HelloWorld/helloworld.jsp 输入用户名,交由http://localhost:88/Struts2He ...

  7. NET基础课--泛型(NET之美)

    1.泛型,类型或方法的一种抽象概括. 2.泛型类:在类型名后面加一个<>,其中传递占位符,也就是类型参数.where是类型约束 可以再查资料 public class SortHelper ...

  8. NET基础课--NET的一些概念0

    0.CIL--公共中间语言 VC++:经过预编译,编译,汇编和链接生成本地可执行代码,支持它运行的是OS和本地cpu指令集. C#:    在.net框架下类似c#的高级语言经过编译生成的文件叫程序集 ...

  9. HTML5+CSS3项目总结

      经过一个月的学习,我基本掌握了HTML5的一些标签的用法和特性,以及一些CSS3的属性的特点和用法. 在本周安排的为期四天的第一阶段的课程的项目实训中,我基本能够熟练运用学到的知识,完成页面的速度 ...

  10. SpringMvc学习-增删改查

    本节主要介绍SpringMVC简单的增删改查功能. 1.查询 dao中的代码 public List<WeatherPojo> getAllWeather(){ String sql=&q ...