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块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
随机推荐
- Java性能监控之Instrumentation
注:网上摘取的资料整理出来,供大家学习理解,希望有所帮助. 1.1. Instrumentation 简介 利用 Java 代码,即 java.lang.instrument 做动态 Ins ...
- 【bzoj4177】Mike的农场 网络流最小割
题目描述 Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不同,其中第i个牲畜围栏中的动物长大后,每只牛可以卖a[i] ...
- BZOJ5154 [Tjoi2014]匹配 【KM算法 + 枚举】
题目链接 BZOJ5154 题解 先跑出一个匹配方案 然后暴力删去每对匹配再检验一下答案是否减小 使用KM算法提升速度 #include<algorithm> #include<io ...
- 熊猫(i)
题目描述 熊猫喜欢吃数,熊猫对与每个数都有他独特的评价.具体来说,熊猫对数 xx 的评价是个四元组 (a, b, c, d)(a,b,c,d),计算方式如下: 首先将 xx 写成二进制形式(不含前导零 ...
- 【CZY选讲·一道图论神题】
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...
- 读入输出优化_C++
当我们考试时遇到大量的读入或者输出时,这些代码会耗费许多运行程序的时间,导致TL 本来 log2n 的算法因为读入被卡成线性的就太不划算了,所以我们这里要采用读入输出优化 getchar 和 putc ...
- Mybatis注解的使用
一.mybatis 简单注解 关键注解词 : @Insert : 插入sql , 和xml insert sql语法完全一样 @Select : 查询sql, 和xml select sql语法完全一 ...
- android与PC直连的socket问题
关键字:abdroid 模拟器 socket 突然有人说使用android的模拟器做socket服务器,PC做客户端,使用UDP通信的时候,android端无法收到数据包.反过来没问题,我觉得这怎么可 ...
- tkinter 表格
import tkinter from tkinter import ttk root = tkinter.Tk() tree = ttk.Treeview(root, show="head ...
- HDU 1846 Brave Game【巴什博弈裸题】
Brave Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...