链接: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));}}
}

线段树区间合并--询问某段区间内最长连续上升子序列即最长上升子串相关推荐

  1. 线段树维护(最大区间和,最大子段和,最长连续上升子序列)

    本文主要介绍用线段树来维护(最大区间和,最大子段和,最长连续上升子序列)的问题. HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P2894 [USACO08FEB]酒 ...

  2. 线段树线段树的创建线段树的查询单节点更新区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  3. HDU 3308 线段树求区间最长连续上升子序列长度

    题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...

  4. 线段树分裂与合并 ----- P2824 [HEOI2016/TJOI2016]排序 [线段树分裂合并 OR 01序列排序+二分线段树]

    题目链接 题目大意: 对一个序列,每次按照升序或者降序排序序列某一段,问你最后的序列是什么? 解法1:二分+线段树 首先我们知道对一个01序列进行排序是很快的!我们只要知道里面有多少个1和多少个0,那 ...

  5. bzoj 2733: [HNOI2012]永无乡(线段树启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3850  Solved: 2061 [Submit][Sta ...

  6. [CSP-S模拟测试]:模板(ac)(线段树启发式合并)

    题目描述 辣鸡$ljh\ NOI$之后就退役了,然后就滚去学文化课了. 他每天都被$katarina$大神虐,仗着自己学过一些姿势就给$katarina$大神出了一道题. 有一棵$n$个节点的以$1$ ...

  7. 【线段树】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 ...

  8. 2015 UESTC 数据结构专题D题 秋实大哥与战争 变化版本的线段树,合并区间,单点查询...

    D - 秋实大哥与战争 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 D ...

  9. 线段树优化建图详解——区间连边之技巧,吊打紫题之利器

    我们从一道例题开始. CF786B Description Solution 朴素解法: 暴力连边+最短路 对于每次连边操作,我们逐一连边,最后在图上跑一遍单源最短路径算法即可. 时间复杂度 O ( ...

最新文章

  1. 使用SQL*PLUS构建完美excel或html输出
  2. kafka python client:PyKafka vs kafka-python
  3. 【独家】一种手机上实现屏幕录制成gif的方案
  4. 物联网标准组织OCF成立 有望解决碎片化问题
  5. python ocr 识别 开源_OCR识别-python版(一)
  6. 这些开源项目 yyds
  7. 风灵月影捆绑软件解决办法(修改器)
  8. 芒果超媒前三季营收102亿:同比降12% 互联网广告收入降26%
  9. html写的3d烟花带字幕,Three.js 3D烟花绽放动画
  10. Html img显示图片的三种方式
  11. ES 索引创建及查询
  12. C# WinForm系列-创建Windows项目
  13. Packet Tracer - 配置扩展 ACL - 场景 1
  14. 浅析供应链金融业务发展态势及提升路径
  15. php如何把网页存成图片格式,php怎么生成图片 网页快照?
  16. 国内主流CMS、SNS、商城等建站系统汇总
  17. Axure.rp三天学习总结
  18. python中怎么表示正数_在Python程序的列表中计算正数和负数
  19. compatible with IntelliJ IDEA only because it doesn‘t define any explicit module dependencies(解决方案)
  20. 中基鸿业这样理财更合理

热门文章

  1. 自学python能干些什么副业-用Python赚钱的5个方法,教你业余时间赚外快!
  2. python和java先学哪个-java和python先学哪个
  3. h5语音识别和文字转语音
  4. 前端链接共享(记录)
  5. JavaScript 之 DOM中的三大对象
  6. react中将html字符串渲染到页面
  7. MySQL 8.0安装记录
  8. vue实现树形结构增删改查
  9. vue(vue-cli+vue-router)+babel+webpack项目搭建入门(四)
  10. mysql保存表出错1075_navicat出现错误1075怎么办