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 [题目类型]线段树 ...
随机推荐
- 变体 variety 计算机学科中的改变类型;输入法的 类型
变体_百度百科 中文为改变原来的体式.或者计算机学科中的改变类型. 变体 variety 输入法的 类型
- sed -i '14s/yes/no/' tftp
修改tftp 内容 # cd /etc/xinetd.d/[root@localhost xinetd.d]# cp tftp tftp.bak[root@localhost xinetd.d]# c ...
- centos7 连接打印机
centos7 连接打印机 2017-08-07 15:05:33 五岳寻仙客 阅读数 2531更多 分类专栏: Liunx的日常使用 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版 ...
- 2019年又迎来Hi1620,鲲鹏920则是Hi1620系列的正式品牌和型号
据记者了解,2013年华为就发布了Hi1610,2014年的Hi1612是ARM64位CPU,2016年的Hi1616是首颗支持多路的ARM处理器,2019年又迎来Hi1620,鲲鹏920则是Hi16 ...
- FOC_矢量控制相关资料
http://www.eepw.com.cn/news/listbylabel/label/FOC/ FOC(field-oriented control)为磁场导向控制,又称为矢量控制(vector ...
- [LeetCode] 231. 2 的幂
位运算 231. 2 的幂 ``` class Solution { public boolean isPowerOfTwo(int n) { int cnt = 0; while (n>0) ...
- mysql-redis连接
# log 数据库连接 class LogMysql(object): conn = None cursor = None def __init__(self): self.conn = pymysq ...
- NVIDIA深度架构
NVIDIA深度架构 本文介绍A100 GPU,NVIDIA Ampere架构GPU的重要新功能. 现代云数据中心中运行的计算密集型应用程序的多样性推动了NVIDIA GPU加速的云计算的爆炸式增长. ...
- mybatis中sql语句必须用${}而不能不用#{}的情况
在mybatis中如果我们使用#{}的方式编写的sql时,#{} 对应的变量自动加上单引号 ' ' 例如: select * from #{param} 当我们给参数传入值为user时,他的sql是这 ...
- 三、使用sudo分配管理权限
使用sudo分配管理权限 su命令 su - [账户名称] :切换到用户,不加用户名默认切换到root su - [账户名称] -c '命令' :以xx用户身份执行命令,注意命令需 ...