LCIS线段树(区间更新)
首先线段树每一个节点包含:[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线段树(区间更新)的更多相关文章
- HDU 3308 LCIS 线段树区间更新
最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛 ,小媛姐.这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel 这个题目 ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
- HDU 1698 线段树 区间更新求和
一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...
- POJ-2528 Mayor's posters (线段树区间更新+离散化)
题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...
- ZOJ 1610 Count the Colors (线段树区间更新)
题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...
- POJ 2528 Mayor's posters (线段树区间更新+离散化)
题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
随机推荐
- ConfigurationManager.ConnectionStrings 类库 取不到值 报错 初始化错误
是因为我把 config 文件写在了 类库中,(擦,很久之前就处理过好多次,总是忘记 写个文章记录下来) 其实应该放在 主目录底下的 web.comfig 里 就是网站项目的 配置文件里,类库找的 是 ...
- hdu 1195 Open the Lock (BFS)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- Offer 收割编程练习赛 87B 方圆距离
与坐标轴平行的矩形和圆的位置关系. 分两种情况. 圆与矩形交集不为空 此时答案为零.问题归结为如何判断圆与矩形交集不为空. 先排除矩形顶点在圆内或圆心在矩形内. 此时,若矩形与圆交集不为空,则必有矩形 ...
- Angular1 基础知识 浅析(含锚点)
1.angular:前端js框架 https://angularjs.org ① SPA单页应用程序 通过ajax从后台获取数据,动态渲染页面,不出现白屏,提高效率,节省流量 (1)锚点值 锚点:是 ...
- bzoj4418 [Shoi2013]扇形面积并
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4418 [题解] 被题目名称吓死系列. 用一棵线段树维护当前有哪些半径. 那么将扇形差分,每段 ...
- DataTable转换为实体集合
using System; using System.Collections; using System.Collections.Generic; using System.Data; using S ...
- kvm虚拟机最佳实践系列3-kvm克隆和静态迁移
KVM克隆和KVM静态迁移 KVM克隆 上一章我们已经有了一个合用的虚拟机镜像,现在我们需要用这个KVM镜像大量的创建和部署 virt-clone就是做这个用的.它简化了我们克隆KVM的步骤. 首先停 ...
- linux文件系统之loop环设备--新建一个文件系统并挂载
1. /dev目录下有所有已经连接到操作系统上的设备,他们能在/dev里出现就表示他们在硬件层面和系统核心层面被识别了.对于stdin.stdout.zero等设备是可以直接用> <这些 ...
- Vue.js入门第一课
这个好像比ANGULAR.JS要轻量一些,看看. <!DOCTYPE html> <html> <head> <meta charset="utf- ...
- [BZOJ4756][Usaco2017 Jan]Promotion Counting 树状数组
4756: [Usaco2017 Jan]Promotion Counting Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 305 Solved: ...