首先线段树每一个节点包含:[b,e],lmax,rmax,max;其中lmax表示从左端点开始连续的最长的增序列长度,rmax表示从e端点开始向左连续的最长下降序列长度,max表示当前区间的连续递增的最长序列长度。对单个节点插入时的信息维护如下:

(1) if 左儿子的右端点的值<右儿子的左端点的值

lmax=左儿子区间长度==左儿子的lmax?左儿子区间长度+右儿子的lmax:左儿子的lmax.

rmax=右儿子区间长度==右儿子的rmax?右儿子区间长度+左儿子的rmax:右儿子的rmax.

max=MAX(lmax,rmax,左儿子的rmax+右儿子的lmax);

(2)否则

lmax=左儿子的lmax;

rmax=右儿子的rmax;

max=MAX(左儿子的max,右儿子的max);

查寻操作如下:

if 当前节点区间==查询区间

返回当前节点的max

否则

返回 MAX(左区间,右区间,跨越边界的长度)

//------------------------------------------------------------------
//---线段树区间更新
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1000000;
struct Tnode{
int b, e;
int lmax;
int rmax;
int max;
int len(){ return e - b + 1; }
};
Tnode tree[4*MAXN];
int p[MAXN];
int n, m;
int max(int a, int b, int c){
return max(max(a, b), c);
}
void Build(int v, int l, int r){
tree[v].b = l, tree[v].e = r;
tree[v].lmax = tree[v].rmax = tree[v].max = 0;
if (l < r){
int mid = (l + r) >> 1;
Build(2 * v + 1, l, mid);
Build(2 * v + 2, mid + 1, r);
}
}
void Insert(int v, int k, int val){
if (tree[v].b == tree[v].e){
//找到叶节点插入
p[k] = val;
tree[v].lmax = tree[v].rmax = tree[v].max = 1;
return;
}
int mid = (tree[v].b + tree[v].e) >> 1;
if (k <= mid)
Insert(2 * v + 1, k, val);
else
Insert(2 * v + 2, k, val);
//接下来更新
if (p[mid] < p[mid + 1]){
if (tree[2 * v + 1].lmax == tree[2 * v + 1].len())
tree[v].lmax = tree[2 * v + 1].len() + tree[2 * v + 2].lmax;
else
tree[v].lmax = tree[2*v+1].lmax; if (tree[2 * v + 2].rmax == tree[2 * v + 2].len())
tree[v].rmax = tree[2 * v + 2].len() + tree[2 * v + 1].rmax;
else
tree[v].rmax = tree[2*v+2].rmax;
tree[v].max = max(tree[2 * v + 1].max, tree[2 * v + 2].max,tree[2 * v + 1].rmax + tree[2 * v + 2].lmax);
}
else{
tree[v].lmax = tree[2*v+1].lmax;
tree[v].rmax = tree[2 * v + 2].rmax;
tree[v].max = max(tree[2 * v + 1].max,tree[2 * v + 2].max);
}
}
int Qurrey(int v,int l, int r){
if (l == tree[v].b&&r == tree[v].e)
return tree[v].max;
int mid = (tree[v].b + tree[v].e) >> 1;
if (r <= mid)
return Qurrey(2 * v + 1, l, r);
else if (l > mid)
return Qurrey(2 * v + 2, l, r);
else{
if (p[mid] < p[mid + 1]){
int left = max(mid + 1 - tree[2 * v + 1].rmax, l);
int right = min(r, mid + tree[2 * v + 2].lmax);
return max(Qurrey(2 * v + 1, l, mid), Qurrey(2 * v + 2, mid + 1, r), right-left+1);
}
else
return max(Qurrey(2 * v + 1, l, mid), Qurrey(2 * v + 2, mid + 1, r));
}
}
int main(){
int i, T,a,b;
char s;
scanf("%d", &T);
while (T--){
scanf("%d%d", &n, &m);
memset(p, 0, sizeof(p));
Build(0, 0, n - 1);
for (i = 0; i < n; i++){
scanf("%d", &p[i]);
Insert(0, i, p[i]);
}
while (m--){
cin >> s;
scanf("%d%d",&a, &b);
if (s == 'U')
Insert(0, a, b);
else
printf("%d\n", Qurrey(0, a, b));
}
}
return 0;
}

  

LCIS线段树(区间更新)的更多相关文章

  1. HDU 3308 LCIS 线段树区间更新

    最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛  ,小媛姐.这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel 这个题目 ...

  2. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

  3. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  4. HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...

  5. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

  6. HDU 1698 线段树 区间更新求和

    一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...

  7. POJ-2528 Mayor's posters (线段树区间更新+离散化)

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  8. ZOJ 1610 Count the Colors (线段树区间更新)

    题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...

  9. POJ 2528 Mayor's posters (线段树区间更新+离散化)

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

随机推荐

  1. 雅礼集训 Day1 T2 折射

    折射 题目描述 小\(\mathrm{Y}\)十分喜爱光学相关的问题,一天他正在研究折射. 他在平面上放置了\(n\)个折射装置,希望利用这些装置画出美丽的折线. 折线将从某个装置出发,并且在经过一处 ...

  2. NOIP2017赛前考试注意事项总结

     考前: 考试前把读入优化和库以及对拍文件打好做好准备工作,另外注意放松心态,太紧张了肯定考不好··将自己的注意力集中起来  考场策略: 考试的基本策略是对每于道题先想个20分钟,如果想不出个靠谱的方 ...

  3. Tomcat学习笔记(二)

    Servlet浅析 javax.servlet.Servlet是一个接口,所有的Servlet必须实现接口里面的方法. 该接口在tomcat/bin中的servlet-api.jar包中. Servl ...

  4. 以jhtml结尾的文件

    用一个实例来说明,直接上代码. LogonAction.java(一个servlet) package com.lz.web.action; import java.io.IOException; i ...

  5. C中堆和栈的区别

    C++中堆和栈的完全解析 内存分配方面: 堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并 ...

  6. Cisco IPC Emergency Responder Error

    Upon startup of the newer Cisco IP Communicator clients (especially on Windows Vista/7), sometimes y ...

  7. 快速了解Android重要机制

    转自 http://www.jianshu.com/p/5f6d79323923 一.Android系统底层研究 关于底层的知识点不是在一篇文章中能讲解清楚,参见本人的Android底层研究系列,不断 ...

  8. Apache二级域名实现

    Apache二级域名实现 首先,你的拥有一个有泛域名解析的顶级域名,例如: domain.com 其次,在 httpd.conf 中打开 mod_rewrite 之后,在 httpd.conf 的最后 ...

  9. MySQL-based databases CVE -2016-6663 本地提权

    @date: 2016/11/3 @author: dlive 0x01 漏洞原文 翻译水平不高求轻喷 感觉作者在写文章的时候有些地方描述的也不是特别清楚,不过结合poc可以清晰理解漏洞利用过程 0x ...

  10. Centos6.5配置阿里云yum源

    很多时候,centos6.5 yum源可能无法访问,报404等等问题,一般情况下我们可以将yum源配置成阿里云的源,当然也可以配置成163的,简单说一下配置成阿里云的: 阿里云镜像源地址:http:/ ...