HDU 3308 LCIS
题意:
U A B: 把第A个数变成B
Q A B: 输出【A,B】最长连续上升子序列(注意是连续 相当于子串)
思路:单点更新 ,区间合并几下左边开头最小 和右边结束最大的两个数即可。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include <iostream> #define lson (i<<1) #define rson (i<<1|1) #define N 100050 using namespace std; int lsum[N*4],rsum[N*4],msum[N*4]; int lmaxn[N*4],rmaxn[N*4]; int a[N]; int max(int x,int y) {return x>y?x:y; } int min(int x,int y) {return x<y?x:y; } void pushup(int i,int l,int r) {int mid=(l+r)>>1;lsum[i]=lsum[lson];rsum[i]=rsum[rson];if(lsum[i]==mid-l+1&&rmaxn[lson]<lmaxn[rson])lsum[i]+=lsum[rson];if(rsum[i]==r-mid&&rmaxn[lson]<lmaxn[rson])rsum[i]+=rsum[lson];msum[i]=max(msum[lson],msum[rson]);if(rmaxn[lson]<lmaxn[rson])msum[i]=max(msum[i],rsum[lson]+lsum[rson]);lmaxn[i]=lmaxn[lson];rmaxn[i]=rmaxn[rson]; } void build(int l,int r,int i) {if(l==r){lsum[i]=rsum[i]=msum[i]=1; lmaxn[i]=rmaxn[i]=a[l];return ;}int mid=(l+r)>>1;build(l,mid,lson);build(mid+1,r,rson);pushup(i,l,r); } void update(int l,int r,int p,int va,int i) {if(l==r){lmaxn[i]=rmaxn[i]=va;return ;}int mid=(l+r)>>1;if(p<=mid)update(l,mid,p,va,lson);else update(mid+1,r,p,va,rson);pushup(i,l,r); } int query(int l,int r,int pl,int pr,int i) {if(l>=pl&&r<=pr){return msum[i];}int mid=(l+r)>>1;if(pr<=mid)return query(l,mid,pl,pr,lson);else if(pl>mid)return query(mid+1,r,pl,pr,rson);else{int maxn1=0,maxn2=0;maxn1=query(l,mid,pl,mid,lson);maxn2=query(mid+1,r,mid+1,pr,rson);maxn1=max(maxn1,maxn2);if(rmaxn[lson]<lmaxn[rson]){int tmp=min(rsum[lson],mid-pl+1)+min(lsum[rson],pr-mid);maxn1=max(maxn1,tmp);}return maxn1;} } int main() {int tt,n,m;scanf("%d",&tt);while(tt--){scanf("%d%d",&n,&m);for(int i=1;i<=n;++i)scanf("%d",&a[i]);build(1,n,1);while(m--){char c;int l,r;scanf(" %c%d%d",&c,&l,&r);if(c=='U'){l++;update(1,n,l,r,1);}else{l++;r++;printf("%d\n",query(1,n,l,r,1));}}}return 0; }
转载于:https://www.cnblogs.com/L-Ecry/p/3886804.html
HDU 3308 LCIS相关推荐
- hdu 3308 LCIS(区间合并)
hdu 3308 LCIS 因为是求"最长连续上升子序列",所以区间合并和跨区间查询都需要建立在num[t[lch].r]<num[t[rch].l]的基础上 跨区间查询时注 ...
- hdu 3308 LCIS 线段树 + 区间合并
传送门 文章目录 题意: 思路: 题意: 思路: 日常水一篇题解. 带修改的求区间连续的递增序列,我们考虑用线段树维护. 直接维护mlenmlenmlen是区间最长的递增序列,lslsls是从左端点开 ...
- hdu.3308 LCIS(线段树,区间合并+单点更新)
按照傻崽大神的线段树修炼路线,自己做的第二道区间合并的题. 问题比较简单明了,区间求最长连续上升子序列,但是是需要单点更新的 n个数, m组操作 Q A B 询问[A,B]区间的最长连续上升子序列: ...
- 【HDU】3308 LCIS
1 #include<cstdio> 2 #define MAXN 100010 3 struct node 4 { 5 int left,right,val; 6 }; 7 int a[ ...
- HDU 3308 线段树求区间最长连续上升子序列长度
题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...
- hdu 3308 线段树
输入一串数字,有两个操作:Q a b 查询a到b区间内严格递增子串的最大长度 : U a b 把第a位数字替换成b .注意输入的编号是从0开始 解法:线段树维护区间的严格递增子串的最大长度即可.注意细 ...
- spark1.0和2.0的区别_Spark2.0 VS Spark 1.* -------SparkSession的区别
Spark .0以前版本: val sparkConf = new SparkConf().setAppName("soyo") val spark = new SparkCont ...
- 线段树开新坑:kuangbin带你飞
写在最前面的废话 这里I以前的题是暑假刚刚开始的时候在家写的,然后多校一波就荒废了 9月开头回家一波,重新填坑,= =,kuangbin带你飞的pdf,这才一半题,后面还有一波,蓝瘦,慢慢写吧,不写题 ...
- 线段树练习——区间合并
这类题目会询问区间中满足条件的连续最长区间,所以PushUp的时候需要对左右儿子的区间进行合并(这里最难理解) hdu 3308 http://acm.hdu.edu.cn/showproblem.p ...
最新文章
- Openssl私建CA
- FFmpeg-20160422-snapshot-bin
- Spring+hibernate里使用jdbc connection
- CodeWarrior 初探(1) USBDM 芯片检测
- php退出页面父元素,jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码...
- 消费金融资金断流,银行抽贷、通道暂停,P2P离场
- Mysql 5.7 的‘虚拟列’是做什么?
- 马云给雅虎员工作的精彩演讲:爱迪生欺骗了世界!
- abrtd:Executable ‘some execution‘ doesn‘t belong to any package and ProcessUnpackaged is set to ‘no‘
- SQL Server的代码生成器
- Linux系统升级维护费,Antergos Linux 宣布停止维护
- 计算机导航医学应用,计算机导航技术在口腔颌面外科应用中的新发展
- Css绝对定位position
- PHP第一天 ① 重置端口命令 netsh winsock reset
- linux udp 套接字编程获取源地址和目的地址(一)
- 把单元格一分为二_excel如何把一个单元格分成两个 excel单元格拆分为二行
- java实现心型代码
- 淮北职业技术学院计算机官网,淮北职业技术学院
- VLINK 的更新版本
- 从程序员到产品经理再到自己创业的心路历程
热门文章
- neo4j 机器学习_neo4j(图数据库)是什么?
- rest 接口怎么传list_如何设计一个优雅的RESTFUL的接口
- 机器视觉:工业线阵相机与面阵相机特点分析
- 【项目实战课】基于Pytorch的DCGAN人脸嘴部表情图像生成实战
- 【AI产品】产品小姐姐分析抖音背后的计算机视觉技术
- 【AI-1000问】为什么LeNet5倒数第二个全连接层维度为84?
- python excel读取出错_python读取excel数据出错
- Docker logs 命令
- Atitit. . 软件命名空间与类名命名单词的统计程序设计v2
- 结对开发4----最大子数组(大数溢出)