题目大意:给一个整数序列,m次询问,每次询问某个区间中最长连续上升子序列的长度。

题目分析:线段树区间合并。维护以区间左端开头的、以区间右端点结尾的和区间最长的上升连续序列。

代码如下:

# include<bits/stdc++.h>
using namespace std;
# define LL long long
# define mid (l+(r-l)/2) const int N=100000; int w[N+5];
int len[N*4+5];
int l1[N*4+5],l3[N*4+5];
int r1[N*4+5],r3[N*4+5]; void pushUp(int rt,int l,int r)
{
len[rt]=0;
if(w[mid]<w[mid+1]){
if(r1[rt<<1]==mid) r1[rt]=r1[rt<<1|1];
else r1[rt]=r1[rt<<1];
if(l1[rt<<1|1]==mid+1) l1[rt]=l1[rt<<1];
else l1[rt]=l1[rt<<1|1]; if(r1[rt<<1|1]-l1[rt<<1]+1>len[rt]){
len[rt]=r1[rt<<1|1]-l1[rt<<1]+1;
l3[rt]=l1[rt<<1];
r3[rt]=r1[rt<<1|1];
}
}else{
l1[rt]=l1[rt<<1|1];
r1[rt]=r1[rt<<1];
}
if(r1[rt]-l+1>len[rt]){
len[rt]=r1[rt]-l+1;
l3[rt]=l,r3[rt]=r1[rt];
}
if(r-l1[rt]+1>len[rt]){
len[rt]=r-l1[rt]+1;
l3[rt]=l1[rt],r3[rt]=r;
}
if(r3[rt<<1]-l3[rt<<1]+1>len[rt]){
len[rt]=r3[rt<<1]-l3[rt<<1]+1;
l3[rt]=l3[rt<<1];
r3[rt]=r3[rt<<1];
}
if(r3[rt<<1|1]-l3[rt<<1|1]+1>len[rt]){
len[rt]=r3[rt<<1|1]-l3[rt<<1|1]+1;
l3[rt]=l3[rt<<1|1];
r3[rt]=r3[rt<<1|1];
}
} void build(int rt,int l,int r)
{
if(l==r){
len[rt]=1;
l1[rt]=r1[rt]=l;
l3[rt]=r3[rt]=l;
}else{
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushUp(rt,l,r);
}
} void update(int rt,int l,int r,int p,int x)
{
if(l==r){
w[l]=x;
}else{
if(p<=mid) update(rt<<1,l,mid,p,x);
if(p>mid) update(rt<<1|1,mid+1,r,p,x);
pushUp(rt,l,r);
}
} int query(int rt,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
return len[rt];
if(R<=mid) return query(rt<<1,l,mid,L,R);
if(L>mid) return query(rt<<1|1,mid+1,r,L,R);
int li=query(rt<<1,l,mid,L,R);
int ri=query(rt<<1|1,mid+1,r,L,R);
int res=max(li,ri);
if(w[mid]<w[mid+1])
res=max(res,min(R,r1[rt<<1|1])-max(L,l1[rt<<1])+1);
return res;
} int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i) scanf("%d",w+i); build(1,0,n-1);
int a,b;
char op[2];
while(m--)
{
scanf("%s%d%d",op,&a,&b);
if(op[0]=='Q'){
printf("%d\n",query(1,0,n-1,a,b));
}else if(op[0]=='U')
update(1,0,n-1,a,b);
}
}
return 0;
}

  

HDU-3308 LCIS(区间合并)的更多相关文章

  1. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

  2. hdu 3308 LCIS(线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others)     ...

  3. HDU 3308 LCIS (经典区间合并)【线段树】

    <题目链接> 题目大意: 给你一段序列,对其进行两种操作,一是修改某个序号的点的值:二是查询某个区间的LCIS(最长上升子序列). 解题分析: 线段树区间合并的典型例题,用求某个区间的LC ...

  4. HDU 3308 LCIS (线段树&#183;单点更新&#183;区间合并)

    题意  给你一个数组  有更新值和查询两种操作  对于每次查询  输出相应区间的最长连续递增子序列的长度 基础的线段树区间合并  线段树维护三个值  相应区间的LCIS长度(lcis)  相应区间以左 ...

  5. HDU 3308 LCIS

    题意: U A B: 把第A个数变成BQ A B: 输出[A,B]最长连续上升子序列(注意是连续  相当于子串) 思路:单点更新 ,区间合并几下左边开头最小  和右边结束最大的两个数即可. #incl ...

  6. hdu 5720(贪心+区间合并)

    Wool Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  7. HDU 3308 LCIS(线段树单点更新区间合并)

    LCIS Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting ...

  8. (简单) HDU 3308 LCIS,线段树+区间合并。

    Problem Description Given n integers. You have two operations: U A B: replace the Ath number by B. ( ...

  9. HDU 3308 LCIS 线段树区间更新

    最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛  ,小媛姐.这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel 这个题目 ...

  10. 线段树(区间维护):HDU 3308 LCIS

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

随机推荐

  1. C++封装、继承、多态

    C++封装继承多态总结 面向对象的三个基本特征 面向对象的三个基本特征是:封装.继承.多态.其中,封装可以隐藏实现细节,使得代码模块化:继承可以扩展已存在的代码模块(类):它们的目的都是为了--代码重 ...

  2. how to reset mac root password

    Reset 10.5 Leopard & 10.6 Snow Leopard password Power on or restart your Mac. At the chime (or g ...

  3. kali linux karmetasploit配置【续】

    Karmetasploit In Action https://www.offensive-security.com/metasploit-unleashed/karmetasploit-action ...

  4. FragmentActivity+FragmentTabHost+Fragement instead of TabActibvity+TabHost+Activity

    http://www.tuicool.com/articles/NzeMJz http://www.tuicool.com/articles/FJ7VBb FragmentTabHost切换Fragm ...

  5. php大力力 [022节]php编程要有一种态度:渴望遇见麻烦

    2015-08-27 php大力力022.php编程要有一种态度:渴望遇见麻烦 不能一遇到问题和麻烦,就烦躁焦躁. 写程序,写代码,调试实验就是天天遇见不可预期的错误bug,这是常态.老生常谈,要适应 ...

  6. PHP中使用的变量

    变量是用于临时的存储值的容器.这些值可以是数字.文本,或者复杂得多的排列组合. 变量在任何编程语言中都居于核心地位,理解它们是使用PHP的关键所在.变量又是指在程序的运行过程中随时可以发生变化的量,是 ...

  7. Date and Time

    The PHP date() function is used to format date and/or a time and formats as timestamp to a more read ...

  8. mysql实现高效率随机取数据

    从数据库中(mysql)随机获取几条数据很简单,但是如果一个表的数据基数很大,比如一千万,从一千万中随机产生10条数据,那就相当慢了,如果同时一百个人访问网站,处理这些个进程,对于一般的服务器来说,肯 ...

  9. (Foundation)NSObject 、 NSString 、 NSMutableString

    1 重构Student和Book类 1.1 问题 本案例需要创建一个Book类,类中有一个整型price属性,用于记录书的价格.还需要创建一个Student类,类中有两个带参属性,它们是整型的年龄ag ...

  10. Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

    1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...