题目大意:维护一个长度为 N 的序列,支持单点修改,区间查询最长连续上升子序列的长度。

题解:

线段树维护一段区间左端点开始的 LCIS 长度,右端点开始的 LCIS 长度以及区间最优解。考虑进行合并,合并后区间的最优解可能由三部分构成,即:左区间的最优解、右区间的最优解和左区间rmx+右区间lmx的值。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10; int n,m,a[maxn];
struct node{
#define ls(o) t[o].lc
#define rs(o) t[o].rc
int lc,rc,lmx,rmx,mx;
}t[maxn<<1];
int tot,root;
inline void pushup(int o,int l,int r){
int mid=l+r>>1;
t[o].mx=max(max(t[ls(o)].mx,t[rs(o)].mx),a[mid]<a[mid+1]?t[ls(o)].rmx+t[rs(o)].lmx:0);
t[o].lmx=t[ls(o)].lmx==mid-l+1&&a[mid]<a[mid+1]?t[ls(o)].lmx+t[rs(o)].lmx:t[ls(o)].lmx;
t[o].rmx=t[rs(o)].rmx==r-mid&&a[mid]<a[mid+1]?t[rs(o)].rmx+t[ls(o)].rmx:t[rs(o)].rmx;
}
int build(int l,int r){
int o=++tot;
if(l==r){t[o].lmx=t[o].rmx=t[o].mx=1;return o;}
int mid=l+r>>1;
ls(o)=build(l,mid),rs(o)=build(mid+1,r);
pushup(o,l,r);
return o;
}
void modify(int o,int l,int r,int pos){
if(l==r)return;
int mid=l+r>>1;
if(pos<=mid)modify(ls(o),l,mid,pos);
else modify(rs(o),mid+1,r,pos);
pushup(o,l,r);
}
int query(int o,int l,int r,int x,int y){
if(l==x&&r==y)return t[o].mx;
int mid=l+r>>1;
if(y<=mid)return query(ls(o),l,mid,x,y);
else if(x>mid)return query(rs(o),mid+1,r,x,y);
else{
int ansl=query(ls(o),l,mid,x,mid);
int ansr=query(rs(o),mid+1,r,mid+1,y);
int ret=0;
if(a[mid]<a[mid+1])ret=min(t[ls(o)].rmx,mid-x+1)+min(t[rs(o)].lmx,y-mid);
return max(ret,max(ansl,ansr));
}
} void read_and_parse(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
root=build(1,n);
}
void solve(){
char opt[2];
int x,y;
while(m--){
scanf("%s%d%d",opt,&x,&y);
if(opt[0]=='Q')++x,++y,printf("%d\n",query(root,1,n,x,y));
else ++x,a[x]=y,modify(root,1,n,x);
}
}
void init(){memset(t,0,sizeof(t)),tot=0;}
int main(){
int T;scanf("%d",&T);
while(T--){
init();
read_and_parse();
solve();
}
return 0;
}

【HDU3308】LCIS的更多相关文章

  1. 【43.49%】【hdu3308】LCIS

    Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission ...

  2. 【CF10D】LCIS(LCIS)

    题意:求两个序列的LCIS n,m<=300,a[i]<=1e9 题意:O(n^2) O(n^3)的话设dp[i,j]为A终点为a[1..i]且B终点为b[j]的最大长度,分a[i]==b ...

  3. 【题解】LCIS

    题目描述 给定两个整数序列,写一个程序求它们的最长上升公共子序列. 输入格式 每个序列用两行表示,第一行是长度L,第二行是该序列. 输出格式 在第一行,输出该LCIS的长度.第二行,输出该LCIS. ...

  4. 【二维树状数组】【CF10D】 LCIS

    传送门 Description 给你两个串,求他们的最长公共上升子序列 Input 第一行是第一个串的长度\(n\) 第二行\(n\)个数代表第一个串 第三行是第二个串的长度\(m\) 第四行\(m\ ...

  5. 【CF10D】 LCIS

    题目链接 最长公共上升子序列 \(f[i][j]\)表示\(A\)的前\(i\)个数,匹配\(B\)的第\(j\)个数,且\(B[j]\)必选时的最长公共上升子序列长度 转移: if(A[i]==B[ ...

  6. 【14.06%】【hdu 5904】LCIS

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission ...

  7. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  8. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  9. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

随机推荐

  1. WPF界面设计—撸大师

    WPF界面设计,模仿了金山卫士,360,鲁大师的界面! <!--无边框窗体--> <Style x:Key="NoResize_window" TargetTyp ...

  2. angularjs的部分总结

    就在这个星期,我们学习了一个神奇的框架叫:"Angular js",它的神奇之处不是它的功能有多强,甚至它的功能还是很简陋的,但是它的那种思想是非常牛逼的;他完全抛弃了我们现在所常 ...

  3. Tensorflow 对上一节神经网络模型的优化

    本节涉及的知识点: 1.在程序中查看变量的取值 2.张量 3.用张量重新组织输入数据 4.简化的神经网络模型 5.标量.多维数组 6.在TensorFlow中查看和设定张量的形态 7.用softmax ...

  4. mysql——单表查询——其它整理示例00

    ), sname ), sage ), ssex ) ); ','zhaolei','1990-01-01','nan'); ','qiandian','1990-12-21','nan'); ',' ...

  5. Junit4 简单使用

    一.环境搭建 对于习惯使用Eclipse开发平台来说,Junit早已是非常通常的插件,在Eclipse开发平台中,可以非常方便地搭建Junit测试环境. 1.在Eclipse上创建工程,任何Java工 ...

  6. HTML笔记(一) 基础标签的介绍

    一个最基本的html文件,必须包含<html>, <head> 和<body> 三个标签 以及<!doctype>声明 1. <!DOCTYPE& ...

  7. 《剑指offer》面试题6 重建二叉树 Java版

    (由一个二叉树的前序和中序序列重建一颗二叉树) 书中方法:我们要重建一棵二叉树,就要不断地找到根节点和根节点的左子结点和右子节点.注意前序序列, 它的第一个元素就是二叉树的根节点,后面的元素分为它的左 ...

  8. 洛谷 P5239 回忆京都 题解

    题面 裸的杨辉三角前缀和,但----- 在求前缀和的时候有可能得到一个负数(由于取模的原因),所以一定要加上模数后再取模!!!! #include <bits/stdc++.h> #def ...

  9. python-day11(正式学习)

    目录 文件高级应用 多重操作 r+t:可读,可写(文件名为a) w+t:可写可读 a+t:可追加可读 文件内指针移动及一些操作 指针移动seek(offset,whence) 寻找指针位置tell() ...

  10. [.net core]8.中间件的概念

    假设我们的中间件是这样的(可以自由排列, 扩展自定义中间件) logging负责记录请求/响应 staticFiles 负责响应 静态文件 MVC 负责响应 视图 当.net core web app ...