hud 3308 LCIS 线段树 区间合并
题意:
Q a b 查询[a, b]区间的最长连续递增子序列的长度
U a b 将下表为a的元素更新为b
区间合并一般都有3个数组:区间最值,左区间最值和右区间最值
具体详见代码
#include <bits/stdc++.h>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std; const int MAXN = 111111;
int mx[MAXN<<2], a[MAXN];
int lmx[MAXN<<2], rmx[MAXN<<2]; void push_up(int rt, int l, int r)
{
lmx[rt] = lmx[rt<<1];
rmx[rt] = rmx[rt<<1|1];
mx[rt] = max(mx[rt<<1], mx[rt<<1|1]);
int m = (l + r) >> 1;
if(a[m] < a[m+1]) //保证是严格递增的
{
if(lmx[rt] == m - l + 1) lmx[rt] += lmx[rt<<1|1];
if(rmx[rt] == r - m) rmx[rt] += rmx[rt<<1];
mx[rt] = max(mx[rt], rmx[rt<<1] + lmx[rt<<1|1]);
}
} void build(int l, int r, int rt)
{
if(l == r)
{
scanf("%d", &a[l]);
mx[rt] = lmx[rt] = rmx[rt] = 1;
return;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
push_up(rt, l, r);
} void update(int p, int c, int l, int r, int rt)
{
if(l == r)
{
a[p] = c;
return;
}
int m = (l + r) >> 1;
if(m >= p) update(p, c, lson);
else update(p, c, rson);
push_up(rt, l, r);
} int query(int L, int R, int l, int r, int rt)
{
if(L <= l && r <= R) return mx[rt];
int m = (l + r) >> 1;
int ret = 0;
if(m >= L) ret = max(ret, query(L, R, lson));
if(m < R) ret = max(ret, query(L, R, rson));
if(a[m] < a[m+1]) //m-L+1是[L,m]的长度,R-m是[m,R]的长度
ret = max(ret, min(rmx[rt<<1], m-L+1) + min(lmx[rt<<1|1], R-m));
return ret;
} int main()
{
// freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
while(T--)
{
int n, m;
scanf("%d%d", &n, &m);
build(0, n-1, 1);
while(m--)
{
char op[3];
int x, y;
scanf("%s%d%d", op, &x, &y);
if(op[0] == 'Q') printf("%d\n", query(x, y, 0, n-1, 1));
else update(x, y, 0, n-1, 1);
}
}
return 0;
}
hud 3308 LCIS 线段树 区间合并的更多相关文章
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
- LCIS HDU - 3308 (线段树区间合并)
LCIS HDU - 3308 Given n integers. You have two operations: U A B: replace the Ath number by B. (inde ...
- hdu-3308 LCIS (线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 3308 (线段树区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作 : 1 修改 单点 a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...
- HDU 3308 LCIS 线段树区间更新
最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛 ,小媛姐.这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel 这个题目 ...
- HDU 3308 LCIS (线段树·单点更新·区间合并)
题意 给你一个数组 有更新值和查询两种操作 对于每次查询 输出相应区间的最长连续递增子序列的长度 基础的线段树区间合并 线段树维护三个值 相应区间的LCIS长度(lcis) 相应区间以左 ...
- hdu 3308(线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU3308 线段树区间合并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
随机推荐
- Nginx——Docker下安装部署
前言 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务 . 一. 环境说明 docker: 18.09.9-ce nginx: 1.1 ...
- Docker网络(5)
一.docker网络介绍 大量的互联网应用服务需要多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合 docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络 ...
- 11.2 uptime:显示系统的运行时间及负载
uptime命令可以输出当前系统时间.系统开机到现在的运行时间.目前有多少用户在线和系统平均负载等信息. [root@cs6 ~]# uptime 17:02:25 up 1:48, 3 user ...
- 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数
strace 是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息.strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字.参数.返回值和执行 ...
- linux 创建网桥
由于最近项目需验证个问题,需求是要创建一个虚拟机网桥,在使用ifconfig命令查看时让docker0网桥不在第一个显示,因此,我们创建一个虚拟网桥让它排在第一位置 项目使用Centos7系统,因此使 ...
- (数据科学学习手札123)Python+Dash快速web应用开发——部署发布篇
1 简介 这是我的系列教程Python+Dash快速web应用开发的第二十期,在上一期中我介绍了利用内网穿透的方式,将任何可以联网的电脑作为"服务器"向外临时发布你的Dash应用. ...
- ImportError:no mudle named 'cv2'
提供一下下载的网址:OpenCV,速度比较慢. 我的anaconda版本Python是3.6的,直接提供百度云下载: 链接:https://pan.baidu.com/s/1Xz9JrE2m-dwPv ...
- 201871030138-杨蕊媛 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-daizh ...
- Centos8配置Nginx开机自启动
第一步:创建service文件,并编辑(可理解为开机时自动启动Nginx的脚本服务文件) vim /lib/systemd/system/nginx.service /lib 与 /usr/lib 里 ...
- 如何安装/导入Arduino库文件及库文件的不同位置与区别(以eFLL中嵌入式模糊逻辑库为例)
网上有数百个可在Aruduino中使用的库,这些代码集使得我们无需从0-1地搭建我们所需功能,这使得学习和使用Arduino变得更加方便简单.除此之外,平时直接从网上download下的代码也很有可能 ...