<题目链接>

题目大意:

给你一段序列,对其进行两种操作,一是修改某个序号的点的值;二是查询某个区间的LCIS(最长上升子序列)。

解题分析:

线段树区间合并的典型例题,用求某个区间的LCIS时,需要比较三个值,一是左区间的LCIS,二是右区间的LCIS,三是左右子区间合并的LCIS。最重要的是第三点如何实现,实现第三点需要维护一个最长后缀上升子序列和最长前缀上升子序列,总之,相对于一般的线段树,区间合并需要对Pushup()函数进行一些改动,query()的时候也要记得对三种情况进行讨论。

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int siz=;
int a[siz],sum[siz<<],lsum[siz<<],rsum[siz<<]; void pushup(int rt,int l,int r) { //区间合并,更新该节点对应的最长上升子序列和最长前、后缀
lsum[rt]=lsum[rt<<]; //最长前缀
rsum[rt]=rsum[rt<<|]; //最长后缀
sum[rt]=max(sum[rt<<],sum[rt<<|]);
/*-- 先更新该节点需要维护的三个值 --*/ int m=(l+r)>>;
if(a[m]<a[m+]){ //如果左右子区间的LCIS能够合并,那么就进一步更新这三个点 if(lsum[rt<<]==(m-l+)) //如果左子区间的最长前缀==左子区间长度
lsum[rt]+=lsum[rt<<|]; //那么该节点的最长前缀除左子区间的最长前缀以外,还要加上右子区间的最长前缀
if(rsum[rt<<|]==(r-m)) //如果右子区间的最长后缀==右子区间长度
rsum[rt]+=rsum[rt<<]; //那么该节点的最长后缀除右子区间的最长后缀外,还要加上左子区间的最长后缀
/*-- 更新rt节点对应区间的最长前、后缀 --*/ sum[rt]=max(sum[rt],rsum[rt<<]+lsum[rt<<|]);
//更新rt节点对应区间的最长上升子序列
}
}
void build(int l,int r,int rt){
if(l==r){ //注意这里的初始化
sum[rt]=;
lsum[rt]=rsum[rt]=;
return;
}
int m=(l+r)>>;
build(l,m,rt<<);
build(m+,r,rt<<|);
pushup(rt,l,r);
}
void update(int loc,int val,int l,int r,int rt){ //单点更新
if(l==r){
a[l]=val;
return;
}
int m=(l+r)>>;
if(loc<=m)
update(loc,val,l,m,rt<<);
else
update(loc,val,m+,r,rt<<|);
pushup(rt,l,r);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R)
return sum[rt];
int m=(l+r)>>;
int ans=; //注意这里ans初始化为1 /*-- 答案一共三种可能,在左区间或右区间或横跨两个区间 --*/
if(L<=m) //左、右区间的LCIS
ans=max(ans,query(L,R,l,m,rt<<));
if(R>m)
ans=max(ans,query(L,R,m+,r,rt<<|)); if(L<=m&&R>=m&&a[m]<a[m+]) //横跨左右两个子区间的情况
ans=max(ans,min(m-L+,rsum[rt<<])+min(R-m,lsum[rt<<|])); //rsum代表区间最长后缀、lsum为区间最长前缀
return ans;
} int main(){ //lsum为区间左端点开始长度
char c; //rsum为区间右端点开始长度
int t,n,m; //sum为区间最长长度
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
build(,n,);
while(m--){
int u,v;
cin>>c>>u>>v;
if(c=='Q'){
u++,v++; //因为题目是从0开始编号
printf("%d\n",query(u,v,,n,));
}
else{
u++;
update(u,v,,n,);
}
}
}
return ;
}

2018-09-11

HDU 3308 LCIS (经典区间合并)【线段树】的更多相关文章

  1. BZOJ 2243:染色(树链剖分+区间合并线段树)

    [SDOI2011]染色Description给定一棵有n个节点的无根树和m个操作,操作有2类:1.将节点a到节点b路径上所有点都染成颜色c:2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认 ...

  2. HDU 1540 区间合并线段树

    题目大意: 就是给定一堆位置,进行删除还原,最后找到 t 位置上的最大连续位置 #include <cstdio> #include <cstring> #include &l ...

  3. HDU 3308 LCIS (线段树&#183;单点更新&#183;区间合并)

    题意  给你一个数组  有更新值和查询两种操作  对于每次查询  输出相应区间的最长连续递增子序列的长度 基础的线段树区间合并  线段树维护三个值  相应区间的LCIS长度(lcis)  相应区间以左 ...

  4. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  5. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  6. hdu 5274 Dylans loves tree(LCA + 线段树)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  7. 【BZOJ4653】【NOI2016】区间(线段树)

    [BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...

  8. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  9. xdoj-1324 (区间离散化-线段树求区间最值)

    思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i]  覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...

随机推荐

  1. python 列表,字典,元组,字符串,常用函数

    飞机票 一.列表方法 1.ls.extend(object) 向列表ls中插入object中的每个元素,object可以是字符串,元组和列表(字符串“abc”中包含3个元组),相当于ls和object ...

  2. Confluence 6 配置白名单

    Confluence 管理员可以通过添加 URLs 到白名单选择出入的链接和使用 RSS 宏,HTML 包含宏和小工具中的内容. 如果一个内容被添加到 Confluence 系统中,但是这个 URLs ...

  3. Confluence 6 查看内容索引概要

    内容索引,通常也被称为查找索引,这个索引被用来在 Confluence 中支持查找.这个索引同时也被其他的一些功能使用,例如在归档邮件中构建邮件主题,View Space Activity 的特性和将 ...

  4. python 之面向对象的三大特性

    面向对象的三大特性 继承 继承和组合 继承进阶 封装 封装(有待完善) 多态 多态

  5. 安装lrzsz 实现windows与linux之间文件互传

    环境:CentOS7.4 执行命令安装: [root@linuxhg01 www]# yum install lrzsz rz // Windows 上传到 linux [root@linuxhg01 ...

  6. 实习笔记 burpsuite

    1.通过设置拦截HTTPS协议消息: 拦截HTTPS协议消息,HTTPS在原有的基础上增加了安全套接字层SSL协议,通过CA证书来验证服务器的身份,在拦截设置中,绑定端口有三种模式,分别是仅本地回路模 ...

  7. Mac下Java JDK的下载安装和配置

    一.下载安装 打开一个搜索引擎,输入JDK,找到Java JDK 如图:  点击打开,同意协议开始下载如图: 下载好以后,安装即可. 安装成功以后,进入根目录,可以找到JDK安装的位置: 资源库——& ...

  8. 论文阅读笔记三十三:Feature Pyramid Networks for Object Detection(FPN CVPR 2017)

    论文源址:https://arxiv.org/abs/1612.03144 代码:https://github.com/jwyang/fpn.pytorch 摘要 特征金字塔是用于不同尺寸目标检测中的 ...

  9. 步步为营-89-SQL语句(删除重复数据)

    1:删除重复数据 --第一步:先找到重复数据 select ProcInstID from record_errorlog group by ProcInstID having count(ProcI ...

  10. EntityFramework Reverse POCO Code First 反向生成器

    https://marketplace.visualstudio.com/items?itemName=SimonHughes.EntityFrameworkReversePOCOGenerator ...