题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值

#include <bits/stdc++.h>
#define N 100005
using namespace std;
int lcs[N<<2],pre[N<<2],suf[N<<2],arr[N];维护区间lcs长度,以左端点为起点的lcs长度,以右端点为终点的lcs长度,这么做是为了处理区间合并后区间总lcs值的更新
void pushup(int l,int r,int rt)
{int m=(l+r)>>1;lcs[rt]=max(lcs[rt<<1],lcs[rt<<1|1]);if(arr[m]<arr[m+1])lcs[rt]=max(lcs[rt],suf[rt<<1]+pre[rt<<1|1]);pre[rt]=pre[rt<<1];if(pre[rt<<1]==m-l+1&&arr[m]<arr[m+1])pre[rt]+=pre[rt<<1|1];suf[rt]=suf[rt<<1|1];if(suf[rt<<1|1]==r-m&&arr[m]<arr[m+1])suf[rt]+=suf[rt<<1];
}
void build(int l,int r,int rt)
{if(l==r){suf[rt]=pre[rt]=lcs[rt]=1;return;}int m=(l+r)>>1;build(l,m,rt<<1);build(m+1,r,rt<<1|1);pushup(l,r,rt);
}
void update(int pos,int val,int l,int r,int rt)
{if(l==r){arr[l]=val;return;}int m=(l+r)>>1;if(pos<=m)update(pos,val,l,m,rt<<1);if(pos>m)update(pos,val,m+1,r,rt<<1|1);pushup(l,r,rt);
}
int query(int L,int R,int l,int r,int rt)
{if(L<=l&&r<=R)return lcs[rt];int m=(l+r)>>1;int mx=0;if(L<=m)mx=max(mx,query(L,R,l,m,rt<<1));if(m<R)mx=max(mx,query(L,R,m+1,r,rt<<1|1));//这时的mx只是各子区间的最大值,必须考虑子区间连接之后的状态int prex=min(R-m,pre[rt<<1|1]);int sufx=min(m-L+1,suf[rt<<1]);if(arr[m]<arr[m+1])mx=max(mx,prex+sufx);return mx;
}
int main()
{int t,n,m;cin>>t;while(t--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",arr+i);build(1,n,1);char cmd[10];int l,r;while (m--){scanf("%s%d%d",cmd,&l,&r);if(cmd[0]=='U')update(l+1,r,1,n,1);else printf("%d\n",query(l+1,r+1,1,n,1));}}return 0;
}

转载于:https://www.cnblogs.com/xusirui/p/9434488.html

HDU 3308 线段树求区间最长连续上升子序列长度相关推荐

  1. hdu 3308 线段树

    输入一串数字,有两个操作:Q a b 查询a到b区间内严格递增子串的最大长度 : U a b 把第a位数字替换成b .注意输入的编号是从0开始 解法:线段树维护区间的严格递增子串的最大长度即可.注意细 ...

  2. hdu 2461(线段树求面积并)

    题意:给出N个矩形,M次询问 每次询问给出R个,问这R个矩形围成的面积 解题思路:对于每次询问,做一次线段树求面积的并操作. 每个节点保存的信息有l,r,cover,len分别表示该节点表示的区间[l ...

  3. 线段树求区间和(单点更新)

    题目1:敌兵布阵  线段树的主要操作:(1)建立线段树(Build)          (2)更新区间值 (Update)           (3)查询区间(Query) 写法一: #include ...

  4. hdu3074 线段树求区间乘积(单点更新)

    题意:       给你n个数,两种操作,(1) 把第b个数改成c (2)算出b-c的乘积,结果对1000000007取余. 思路:       线段树单点更新,简单题目,不多解释,具体看代码. #i ...

  5. 【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和...

    题意:给出N个数,M个操作.操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和.n,m<=100000,ai<=1000 题解: 当年(其实也就是 ...

  6. HDU 4267 线段树 离散点区间更新, 自叶子节点至根单点查询

    题意: n个数字 下面n个数字表示数列 2个操作 1 [u, v]  k  add [u,v ]区间 (u点要计算)每隔k个位置,该数字+add 2 pos 询问 pos下标的值(下标从1开始) 思路 ...

  7. Distinct Characters Queries CodeForces - 1234D(线段树求区间字母种类数)

    You are given a string ss consisting of lowercase Latin letters and qq queries for this string. Reca ...

  8. 线段树求区间最大值RMQ(单点更新)

    题目:HDU1754 #include <stdio.h> #define maxn 222222 #define lson l,m,rt<<1 #define rson m+ ...

  9. C++实现线段树求区间和-区间查询

    代码如下: #include <iostream> using namespace std; const int N = 10010; int input[N];struct node { ...

最新文章

  1. Page页面生命周期——微信小程序
  2. python中的模运算符_Python中的字符串模运算符与format函数
  3. Android 软键盘弹出时布局内指定内容上移实现及问题解决
  4. Loj 6485. LJJ 学二项式定理
  5. matlab模拟三体运动_从灯泡到超级计算机,如何模拟浩瀚星空?| 赛先生
  6. mac自带python怎么用_怎么在mac上使用python
  7. matlab png转02,matlab把图片pgm格式转换成png格式
  8. 基于C++中常见内存错误的总结
  9. SQL 中having 和where的区别(转)
  10. 微软公告:Visual Basic 6 完全兼容 Windows 8 的整个产品周期
  11. 寒假训练营第四次作业
  12. python装饰器用法
  13. 史上最真实的网络飙车游戏
  14. 数据结构——绪论、时间复杂度
  15. input框中的背景文字
  16. 浅谈视觉外观检测系统中存在哪几大技术难点?
  17. 机器人是如何完成避障的?机器人避障解决方案解读
  18. 51单片机函数发生器
  19. mysql binlog xid_解析MYSQL BINLOG 二进制格式(7)--Xid_log_event/XID_EVENT
  20. 11-2犀牛读书笔记

热门文章

  1. 【人工智能作业及答案】什么叫智能?什么叫人工智能?人工智能科学体系大致分哪几个层次?
  2. golang goroutine的调度模型:MPG模式
  3. K8S集群搭建:虚拟机克隆
  4. Python jsonpath库的使用:解析json并将结果保存到文件
  5. 使用jQuery OCUpload实现excel文件一键上传功能
  6. 基于 abp vNext 和 .NET Core 开发博客项目 - 自定义仓储之增删改查
  7. jsp页面其本质就是一个servlet
  8. C语言的特点是什么?
  9. Java注解原来如此通俗易懂
  10. python有内存处理模块吗_使用Python多处理的高内存使用