LCIS

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6592    Accepted Submission(s): 2866

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
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
 
Author
shǎ崽
 
Source
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pi (4*atan(1.0))
const int N=1e5+,M=4e6+,inf=1e9+;
struct is
{
int l,r;
int lm,mm,rm;
}tree[N<<];
int val[N];
void buildtree(int l,int r,int pos)
{
tree[pos].l=l;
tree[pos].r=r;
if(l==r)
{
tree[pos].lm=tree[pos].rm=tree[pos].mm=;
return;
}
int mid=(l+r)>>;
buildtree(l,mid,pos<<);
buildtree(mid+,r,pos<<|);
tree[pos].lm=tree[pos<<].lm;
tree[pos].rm=tree[pos<<|].rm;
if(val[tree[pos<<].r]<val[tree[pos<<|].l])
tree[pos].mm=max(tree[pos<<].mm,max(tree[pos<<|].mm,tree[pos<<].rm+tree[pos<<|].lm));
else
tree[pos].mm=max(tree[pos<<].mm,tree[pos<<|].mm);
if(val[tree[pos<<].r]<val[tree[pos<<|].l]&&tree[pos<<].lm==tree[pos<<].r-tree[pos<<].l+)
tree[pos].lm+=tree[pos<<|].lm;
if(val[tree[pos<<].r]<val[tree[pos<<|].l]&&tree[pos<<|].rm==tree[pos<<|].r-tree[pos<<|].l+)
tree[pos].rm+=tree[pos<<].rm;
}
void update(int point,int pos)
{
if(tree[pos].l==tree[pos].r)
return;
int mid=(tree[pos].r+tree[pos].l)>>;
if(point>mid)
update(point,pos<<|);
else
update(point,pos<<);
tree[pos].lm=tree[pos<<].lm;
tree[pos].rm=tree[pos<<|].rm;
if(val[tree[pos<<].r]<val[tree[pos<<|].l])
tree[pos].mm=max(tree[pos<<].mm,max(tree[pos<<|].mm,tree[pos<<].rm+tree[pos<<|].lm));
else
tree[pos].mm=max(tree[pos<<].mm,tree[pos<<|].mm);
if(val[tree[pos<<].r]<val[tree[pos<<|].l]&&tree[pos<<].lm==tree[pos<<].r-tree[pos<<].l+)
tree[pos].lm+=tree[pos<<|].lm;
if(val[tree[pos<<].r]<val[tree[pos<<|].l]&&tree[pos<<|].rm==tree[pos<<|].r-tree[pos<<|].l+)
tree[pos].rm+=tree[pos<<].rm;
}
is query(int L,int R,int pos)
{
if(tree[pos].l==L&&tree[pos].r==R)
return tree[pos];
int mid=(tree[pos].l+tree[pos].r)>>;
if(mid<L)
return query(L,R,pos<<|);
else if(mid>=R)
return query(L,R,pos<<);
else
{
is a=query(L,mid,pos<<);
is b=query(mid+,R,pos<<|);
is ans;
ans.l=a.l,ans.r=b.r;
ans.lm=a.lm;
ans.rm=b.rm;
if(val[a.r]<val[b.l])
ans.mm=max(a.mm,max(b.mm,a.rm+b.lm));
else
ans.mm=max(a.mm,b.mm);
if(val[a.r]<val[b.l]&&a.lm==a.r-a.l+)
ans.lm+=b.lm;
if(val[a.r]<val[b.l]&&b.rm==b.r-b.l+)
ans.rm+=a.rm;
return ans;
}
}
char a[];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&val[i]);
buildtree(,n,);
while(m--)
{
int l,r;
scanf("%s%d%d",a,&l,&r);
l++;
if(a[]=='U')
val[l]=r,update(l,);
else
r++,printf("%d\n",query(l,r,).mm);
}
}
return ;
}

hdu 3308 线段树 区间合并+单点更新+区间查询的更多相关文章

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

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

  2. 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)

    P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...

  3. HDU 2795 线段树区间最大值,单点更新+二分

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. hdu 1166 线段树 区间求和 +单点更新 CD模板

    题目链接 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  5. hdu 1754 线段树 水题 单点更新 区间查询

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  7. HDU 3911 线段树区间合并

    北京赛区快了,准备袭击数据结构和图论.倒计时 18天,线段树区间合并.维护一个最长连续.. 题意:给一个01串,以下有一些操作,问区间最长的连续的1的个数 思路:非常裸的线段树区间合并 #includ ...

  8. hdu 1116 敌兵布阵 线段树 区间求和 单点更新

    线段树的基本知识可以先google一下,不是很难理解 线段树功能:update:单点增减 query:区间求和 #include <bits/stdc++.h> #define lson ...

  9. HDU(1166),线段树模板,单点更新,区间总和

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 第一次做线段树,帆哥的一句话,我记下来了,其实,线段树就是一种处理数据查询和更新的手段. 然后, ...

随机推荐

  1. 经常使用socket函数具体解释

    经常使用socket函数具体解释 关于socket函数,每一个的意义和基本功能都知道,但每次使用都会去百度,參数究竟是什么,返回值代表什么意义.就是说用的少,也记得不够精确. 每次都查半天.常常烦恼于 ...

  2. Angular Material表单提交及验证

    AngularJS中一些表单验证属性: 修改过的表单,只要用户修改过表单,无论输入是否通过验证,该值都将返回false{formName}.{inputFieldName}.$dirty 合法的表单, ...

  3. 【JMeter4.0学习(五)】JMeter对服务器监控测试脚本开发

    目录: 下载相关JMeter插件 服务器监控测试脚本开发 附:参考相关文档 本文主要来说一下如何通过JMeter插件来监控服务器CPU.内存.磁盘.网络等相关资源. 一.首先,需要下载相关JMeter ...

  4. 为什么Goroutine能有上百万个,Java线程却只能有上千个?

      作者|Russell Cohen   译者|张卫滨   本文通过 Java 和 Golang 在底层原理上的差异,分析了 Java 为什么只能创建数千个线程,而 Golang 可以有数百万的 Go ...

  5. 【JavaEE】Springmvc搭建方法及example

    现在介绍SSH的文章很多,但是适合自己需求的却经常找不到,这些东西呢,会了之后总会感觉别人的程序哪里哪里别扭,会之前呢就感觉很混乱,而且SSH的官方文档,至少在我看来是“会者勉强能看.不会者一片迷茫” ...

  6. 简洁的一键SSH脚本

    这里发一个自己图省事搞的一个批量打通SSH的脚本,可能对于好多朋友也是实用的,是expect+python的一个组合实现,原理非常easy, 使用起来也不复杂,在此还是简单贴出来说说. noscp.e ...

  7. C语言基础知识【运算符】

    C 运算符1.运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C 语言内置了丰富的运算符,并提供了以下类型的运算符:算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符2.杂项运算符 ↦ ...

  8. Java final关键字特点

    一.特点 1.由于继承,方法可以重写,所以父类的功能就会被子类覆盖2.有时候我们不想子类覆盖父类的功能,这时候我们可以使用final关键字3.final可以修饰:类.变量,方法.4.final修饰类, ...

  9. Windows7 配置两个版本的java环境,可自由切换

    1. 准备工作 下载jdk: jdk1.7[http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads ...

  10. ElasticSearch(二十七)type的数据结构

    1.什么是type? type,是一个index中用来区分类似的数据的,类似的数据,但是可能有不同的fields,而且有不同的属性来控制索引建立.分词器field的value,在底层的lucene中建 ...