线段树区间合并--询问某段区间内最长连续上升子序列即最长上升子串
链接:https://www.nowcoder.com/acm/contest/158/B
来源:牛客网
最长区间
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给你一个长度为 n 的序列 a ,求最长的连续的严格上升区间的长度。
同时会进行 m 次修改,给定 x , y ,表示将 ax 修改为 y ,每次修改之后都要求输出答案。
输入描述:
第一行 2 个数 n,m,表示序列长度,修改次数; 接下来一行 n 个数表示 ; 接下来 m 行,每行 2 个数 x , y ,描述一次修改。
输出描述:
第一行 1 个数表示最初的答案; 接下来 m 行,第 i 行 1 个数表示第 i 次修改后的答案。
示例1
输入
复制
4 3 1 2 3 4 3 1 2 5 3 7
输出
复制
4 2 2 3
说明
序列变换如下: 1 2 3 4 1 2 1 4 1 5 1 4 1 5 7 4
备注:
n,m ≤ 100000,1 ≤ x ≤ n,1 ≤ ai,y ≤ 100
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 100010
int lsum[maxn<<2];//lsum表示区间左起最长连续上升序列的长度
int rsum[maxn<<2];//rsum表示区间右起最长连续上升序列的长度
int msum[maxn<<2];//msum表示区间最长连续上升序列的长度
int num[maxn];void pushup(int l,int r,int rt)//区间合并
{int m=(l+r)>>1;lsum[rt]=lsum[rt<<1];rsum[rt]=rsum[rt<<1|1];msum[rt]=max(msum[rt<<1],msum[rt<<1|1]);if(num[m]<num[m+1])//如果做区间的右端小于右区间的左端{if(lsum[rt<<1]==m-l+1)//如果左区间全为上升序列lsum[rt]=lsum[rt<<1]+lsum[rt<<1|1];if(rsum[rt<<1|1]==r-m)//如果右区间全为上升序列rsum[rt]=rsum[rt<<1|1]+rsum[rt<<1];msum[rt]=max(msum[rt],lsum[rt<<1|1]+rsum[rt<<1]);}
}void build(int l,int r,int rt)
{if(l==r){lsum[rt]=rsum[rt]=msum[rt]=1;return;}int m=(l+r)>>1;build(lson);build(rson);pushup(l,r,rt);
}void updata(int p,int c,int l,int r,int rt)//单点更新
{if(l==r){num[l]=c;return ;}int m=(l+r)>>1;if(m>=p)updata(p,c,lson);else updata(p,c,rson);pushup(l,r,rt);
}int query(int L,int R,int l,int r,int rt)
{if(l>=L&&R>=r)return msum[rt];int ret=0;int m=(l+r)>>1;if(m>=L) ret=max(ret,query(L,R,lson));if(R>m) ret=max(ret,query(L,R,rson));if(num[m]<num[m+1]) //如果做区间的右端小于右区间的左端,就连起来{ret=max(ret,min(m-L+1,rsum[rt<<1])+min(R-m,lsum[rt<<1|1]));}return ret;
}int main()
{int n,t,m,i;char s[10];scanf("%d%d",&n,&m);{for(i=1;i<=n;i++)scanf("%d",&num[i]);build(1,n,1);int a,b;printf("%d\n",query(1,n,1,n,1));while(m--){scanf("%d %d",&a,&b);updata(a,b,1,n,1);printf("%d\n",query(1,n,1,n,1));}}
}
线段树区间合并--询问某段区间内最长连续上升子序列即最长上升子串相关推荐
- 线段树维护(最大区间和,最大子段和,最长连续上升子序列)
本文主要介绍用线段树来维护(最大区间和,最大子段和,最长连续上升子序列)的问题. HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P2894 [USACO08FEB]酒 ...
- 线段树线段树的创建线段树的查询单节点更新区间更新
目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...
- HDU 3308 线段树求区间最长连续上升子序列长度
题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...
- 线段树分裂与合并 ----- P2824 [HEOI2016/TJOI2016]排序 [线段树分裂合并 OR 01序列排序+二分线段树]
题目链接 题目大意: 对一个序列,每次按照升序或者降序排序序列某一段,问你最后的序列是什么? 解法1:二分+线段树 首先我们知道对一个01序列进行排序是很快的!我们只要知道里面有多少个1和多少个0,那 ...
- bzoj 2733: [HNOI2012]永无乡(线段树启发式合并)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3850 Solved: 2061 [Submit][Sta ...
- [CSP-S模拟测试]:模板(ac)(线段树启发式合并)
题目描述 辣鸡$ljh\ NOI$之后就退役了,然后就滚去学文化课了. 他每天都被$katarina$大神虐,仗着自己学过一些姿势就给$katarina$大神出了一道题. 有一棵$n$个节点的以$1$ ...
- 【线段树】HDU 3397 Sequence operation 区间合并
操作 Change operations: 0 a b change all characters into '0's in [a , b] 1 a b change all characters i ...
- 2015 UESTC 数据结构专题D题 秋实大哥与战争 变化版本的线段树,合并区间,单点查询...
D - 秋实大哥与战争 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 D ...
- 线段树优化建图详解——区间连边之技巧,吊打紫题之利器
我们从一道例题开始. CF786B Description Solution 朴素解法: 暴力连边+最短路 对于每次连边操作,我们逐一连边,最后在图上跑一遍单源最短路径算法即可. 时间复杂度 O ( ...
最新文章
- 使用SQL*PLUS构建完美excel或html输出
- kafka python client:PyKafka vs kafka-python
- 【独家】一种手机上实现屏幕录制成gif的方案
- 物联网标准组织OCF成立 有望解决碎片化问题
- python ocr 识别 开源_OCR识别-python版(一)
- 这些开源项目 yyds
- 风灵月影捆绑软件解决办法(修改器)
- 芒果超媒前三季营收102亿:同比降12% 互联网广告收入降26%
- html写的3d烟花带字幕,Three.js 3D烟花绽放动画
- Html img显示图片的三种方式
- ES 索引创建及查询
- C# WinForm系列-创建Windows项目
- Packet Tracer - 配置扩展 ACL - 场景 1
- 浅析供应链金融业务发展态势及提升路径
- php如何把网页存成图片格式,php怎么生成图片 网页快照?
- 国内主流CMS、SNS、商城等建站系统汇总
- Axure.rp三天学习总结
- python中怎么表示正数_在Python程序的列表中计算正数和负数
- compatible with IntelliJ IDEA only because it doesn‘t define any explicit module dependencies(解决方案)
- 中基鸿业这样理财更合理
热门文章
- 自学python能干些什么副业-用Python赚钱的5个方法,教你业余时间赚外快!
- python和java先学哪个-java和python先学哪个
- h5语音识别和文字转语音
- 前端链接共享(记录)
- JavaScript 之 DOM中的三大对象
- react中将html字符串渲染到页面
- MySQL 8.0安装记录
- vue实现树形结构增删改查
- vue(vue-cli+vue-router)+babel+webpack项目搭建入门(四)
- mysql保存表出错1075_navicat出现错误1075怎么办