题意: 有两种操作  一种是单点改为b  一种是给出区间ab  区间ab的最大上升子序列个数。。

线段树目前学了三种  第一种单点操作很简单   第二种区域操作加上懒惰标记即可

现在这种 为区间合并。。。。多看就好了

#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define lson L,m,pos<<1
#define rson m+1,R,pos<<1|1
#define mid m=(L+R)>>1
#define LL long long
int lsum[N<<],rsum[N<<],ssum[N<<],num[N]; void up(int L,int R,int pos)
{
int mid;
lsum[pos]=lsum[pos<<];
rsum[pos]=rsum[pos<<|];
ssum[pos]=max(ssum[pos<<],ssum[pos<<|]);//向上
if(num[m]<num[m+])
{
if(lsum[pos]==(m-L+))lsum[pos]+=lsum[pos<<|];
if(rsum[pos]==(R-m))rsum[pos]+=rsum[pos<<];
ssum[pos]=max(ssum[pos],lsum[pos<<|]+rsum[pos<<] );
}
} void build(int L,int R,int pos)
{
if(L==R)
{
scanf("%d",&num[L]);
lsum[pos]=rsum[pos]=ssum[pos]=;
return ;
}
int mid;
build(lson);
build(rson);
up(L,R,pos);
} void update(int x,int v,int L,int R,int pos)
{
if(L==R)
{
num[L]=v;
return;
}
int mid;
if(x<=m)update(x,v,lson);
else update(x,v,rson);
up(L,R,pos);
}
int query(int l,int r,int L,int R,int pos)
{
if(l<=L&&r>=R)
return ssum[pos];
int mid;
int ans=;
if(l<=m)ans=max(ans,query(l,r,lson));
if(r>m)ans=max(ans,query(l,r,rson));
if(num[m]<num[m+])
ans=max(ans,min(m-l+,rsum[pos<<])+min(r-m,lsum[pos<<|] ));
return ans;
} int main()
{
char s[];
int cas;
scanf("%d",&cas);
while(cas--)
{
int n,q;
scanf("%d%d",&n,&q);
build(,n,);
while(q--)
{
int a,b;
scanf("%s%d%d",s,&a,&b);
if(s[]=='Q')
printf("%d\n",query(a+,b+,,n,));
else
update(a+,b,,n,);
}
}
return ;
}

LCIS hdu3308 (线段树 区间合并)的更多相关文章

  1. HDU3308 线段树区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...

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

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

  3. LCIS(线段树区间合并)

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

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

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

  5. hdu3308 线段树——区间合并

    更新一个点: 求某个区间的最长连续上升序列: 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 #include <cstdio> #in ...

  6. hdu3308 线段树 区间合并

    给n个数字 U表示第A个数改为B.A是从0开始. Q输出最大的递增序列个数. 考虑左边,右边,和最大的. #include<stdio.h> #define lson l,m,rt< ...

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

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

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

    LCIS HDU - 3308 Given n integers. You have two operations: U A B: replace the Ath number by B. (inde ...

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

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

随机推荐

  1. Docker镜像加速==》阿里云加速器

    1.使用阿里云加速器加快获取docker官方的镜像 步骤一:如果没有阿里云账号,需要注册阿里云开发账号 https://dev.aliyun.com/ 步骤二:进入加速器页面获取加速信息 https: ...

  2. C/C++ 类成员函数指针 类成员数据指针

    普通函数指针:  "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*p ...

  3. Redis的持久化数据

    Redis支持两种持久化:RDB和AOF模式 一.名词解释: RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot).AOF:持久化记录服务器执行的 ...

  4. python爬虫 scrapy3_ 安装指南

      安装指南 安装Scrapy 注解 请先阅读 平台安装指南. 下列的安装步骤假定您已经安装好下列程序: Python 2.7 Python Package: pip and setuptools. ...

  5. C#实现物联网系统温度解析的函数(支持补码)

    基于物联网协议上传数据,其中温度占两个字节,如01 27,表示温度值为29.7.温度负值为补码(也就是温度值为有符号数),例如0XFFFF值为负1(-0.1度). 针对补码要求,修改数据解析函数如下: ...

  6. c# yield关键字原理详解

    c# yield关键字的用法 1.yield实现的功能 yield return: 先看下面的代码,通过yield return实现了类似用foreach遍历数组的功能,说明yield return也 ...

  7. SQL语句(十四)子查询

    --1. 使用IN关键字 --例1 查询系别人数不足5人的系别中学生的学号.姓名和系别 --系别人数不足5人的系别 ==>选择条件 select Sdept from Student Group ...

  8. 【原创】when.js2.7.1源码解析

    现在,用回调处理一些复杂的逻辑,显得代码臃肿,难于阅读,特别是异步,嵌套. 解决这样的问题,可以是之前所说的Backbone.Events的pubsub,或者是今天要说的when.js所实现的prom ...

  9. 模拟jQuery中的ready方法及实现按需加载css,js

    一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的源码,涉及到的模块比较多,(水平有限)代码比较难看懂:自己结合 ...

  10. TED_Topic10:The case for engineering our food

    By Pamela Ronald Pamela Ronald studies the genes that make plants more resistant to disease and stre ...