http://acm.hdu.edu.cn/showproblem.php?pid=3308

题意: 两个操作  : 1 修改 单点  a 处的值。

2 求出 区间【a,b】内的最长上升子序列。

做法:线段树区间合并。了解线段树的具体含义很容易。

 1 // by caonima
 2 // hehe
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <cmath>
 8 using namespace std;
 9 const int MAX= 1e5+;
 int Lsum[MAX<<],Rsum[MAX<<],Msum[MAX<<];
 int Lnum[MAX<<],Rnum[MAX<<];
 int a[MAX];
 char Q[];
 
 void push_up(int o,int m) {
     Lsum[o]=Lsum[o<<];
     Rsum[o]=Rsum[o<<|];
     Msum[o]=max(Msum[o<<],Msum[o<<|]);
     Lnum[o]=Lnum[o<<];
     Rnum[o]=Rnum[o<<|];
     if(Rnum[o<<]<Lnum[o<<|]) {
         if(Lsum[o<<]==(m-(m>>))) Lsum[o]+=Lsum[o<<|];
         if(Rsum[o<<|]==(m>>)) Rsum[o]+=Rsum[o<<];
         Msum[o]=max(Msum[o],Rsum[o<<]+Lsum[o<<|]);
     }
     return ;
 }
 
 void build(int L,int R,int o) {
     if(L==R) {
         Lsum[o]=Rsum[o]=Msum[o]=;
         Lnum[o]=Rnum[o]=a[L];
         return ;
     }
     int mid=(L+R)>>;
     build(L,mid,o<<);
     build(mid+,R,o<<|);
     push_up(o,R-L+);
 }
 
 void Update(int L,int R,int o,int k,int val) {
     if(L==R) {
         Lnum[o]=Rnum[o]=val;
       //  Lsum[o]=Rsum[o]=Msum[o]=1;
         return ;
     }
     int mid=(L+R)>>;
     if(k<=mid) Update(L,mid,o<<,k,val);
     else Update(mid+,R,o<<|,k,val);
     push_up(o,R-L+);
 }
 
 int Query(int L,int R,int o,int ls,int rs) {
     if(ls<=L&&rs>=R) {
         return Msum[o];
     }
     int mid=(L+R)>>;
     int ans=;
     if(ls<=mid) ans=max(ans,Query(L,mid,o<<,ls,rs));
     if(rs>mid) ans=max(ans,Query(mid+,R,o<<|,ls,rs));
     if(Rnum[o<<]<Lnum[o<<|])
     ans=max(ans,min(mid-ls+,Rsum[o<<])+min(rs-mid,Lsum[o<<|]));
     return ans;
 }
 
 int main() {
     int cas,n,m,ls,rs;
     scanf("%d",&cas);
     while(cas--) {
         scanf("%d %d",&n,&m);
         for(int i=;i<=n;i++) scanf("%d",&a[i]);
         build(,n,);
         for(int i=;i<=m;i++) {
             scanf("%s %d %d",Q,&ls,&rs);
             if(Q[]=='Q') {
                 int res=Query(,n,,ls+,rs+);
                 printf("%d\n",res);
             }
             else {
                 Update(,n,,ls+,rs);
             }
         }
     }
     return ;

85 }

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

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

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

  2. hdu 3308 线段树 区间合并+单点更新+区间查询

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

  3. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  4. HDU 3911 线段树区间合并

    北京赛区快了,准备袭击数据结构和图论.倒计时 18天,线段树区间合并.维护一个最长连续.. 题意:给一个01串,以下有一些操作,问区间最长的连续的1的个数 思路:非常裸的线段树区间合并 #includ ...

  5. hdu 1806(线段树区间合并)

    Frequent values Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

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

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

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

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

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

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

  9. hdu 3911 Black And White (线段树 区间合并)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意: 给你一段01序列,有两个操作: 1.区间异或,2.询问区间最长的连续的1得长度 思路: ...

随机推荐

  1. bzoj 2200: [Usaco2011 Jan]道路和航线【spfa】

    直接跑最短路就行了--还不用判负环 #include<iostream> #include<cstdio> #include<queue> using namesp ...

  2. Linux命令(007) -- systemctl

    systemctl命令是系统服务管理指令,它实际上是将service和chkconfig两个命令组合到一起. 任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd ...

  3. C#模拟百度登录并到指定网站评论回帖(五)

    前面的四篇已经说完了全部的模拟百度登录,接下来就是到指定的网站去发表评论,当然你也可能是获取其他信息,其实这些套路都是万变不离其宗的,弄懂之后觉得像这种请求-响应获取信息的功能实在很简单(想起当初走的 ...

  4. P2668 斗地主 贪心+深搜

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  5. String field contains invalid UTF-8 data when serializing a protocol buffer. Use the 'bytes' type if you intend to send raw bytes.

    [libprotobuf ERROR google/protobuf/wire_format.cc:1053] String field contains invalid UTF-8 data whe ...

  6. Javascript DOM 编程艺术(第二版)读书笔记——DOM基础

    1.DOM是什么 D=document(文档) O=object(对象) M=Model(模型) DOM又称节点树 一些术语: parent(父)   child(子)   sibling(兄弟)   ...

  7. Spark学习之RDD编程(2)

    Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...

  8. 如何取消android studio启动时自动打开上次关闭的项目

    Androidstudio默认每次android studio启动就会自动打开上次关闭的项目,如果想要取消并让它显示此界面 只需要  

  9. 学习RFT之:TestObject.find方法的了解与使用

    第一部分:了解TestObject.find 一.TestObject.find方法的作用 1.测试过程中动态的找到测试对象(控件.标签等),使我们的测试用例不再依赖RFT自带的对象地图(Object ...

  10. EF CodeFirst 不得不说的Where与OrderBy

    先来聊上5毛钱的“排序” Code: using (ApplicationDbContext Db=new ApplicationDbContext()) { var res = Db.Threes. ...