更新一个点;

求某个区间的最长连续上升序列;

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

 #include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100009
#define mid int m=(l+r)>>1
int num[maxn], lsum[maxn<<], rsum[maxn<<], msum[maxn<<], n, m, p, v, a, b;
void pushup(int o, int l, int r)
{
mid;
if (num[m] < num[m+])
{
lsum[o] = (lsum[o<<] == m+-l) ? (m+-l+lsum[o<<|]) : lsum[o<<];
rsum[o] = (rsum[o<<|] == r-m) ? (r-m+rsum[o<<]) : rsum[o<<|];
msum[o] = max(max(msum[o<<], msum[o<<|]), lsum[o<<|] + rsum[o<<]);
}
else lsum[o] = lsum[o<<], rsum[o] = rsum[o<<|], msum[o] = max(msum[o<<], msum[o<<|]);
}
void build(int o, int l, int r)
{
if (l == r) {lsum[o]= rsum[o] = msum[o] = ; return;}
mid; build(o<<, l, m), build(o<<|, m+, r), pushup(o, l, r);
}
void update(int o, int l, int r)
{
if (l == r) {num[p] = v; return;}
mid; if (p <= m) update(o<<, l, m); else update(o<<|, m+, r); pushup(o, l, r);
}
int query(int o, int l, int r)
{
if (a <= l && b >= r) return msum[o];
mid; int ret = ;
if (a <= m) ret = max(ret, query(o<<, l, m)); if (b > m) ret = max(ret, query(o<<|, m+, r));
if (num[m] < num[m+]) ret = max(ret, min(m-a+, rsum[o<<])+min(b-m, lsum[o<<|])); return ret;
}
int main(void)
{
int t, n, m; char ch[]; scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m); for (int i = ; i <= n; scanf("%d", num+i++)); build(, , n);
while (m--)
{
scanf("%s%d%d", ch, &a, &b); a++, b++;
if (ch[] == 'Q') printf("%d\n", query(, , n)); else p = a, v = b-, update(, , n);
}
}
return ;
}

。。

hdu3308 线段树——区间合并的更多相关文章

  1. HDU3308 线段树区间合并

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

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

    题意: 有两种操作  一种是单点改为b  一种是给出区间ab  区间ab的最大上升子序列个数.. 线段树目前学了三种  第一种单点操作很简单   第二种区域操作加上懒惰标记即可 现在这种 为区间合并. ...

  3. hdu3308 线段树 区间合并

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

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

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

  5. POJ 3667 Hotel(线段树 区间合并)

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

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

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

  7. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  8. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

  9. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. ubuntu 14.04 上安装有道词典

    Ubuntu 14.04用户在安装前要更新系统,即update&dist-upgrade. 下载地址:32/64bits http://codown.youdao.com/cidian/lin ...

  2. batch insert 1 million datas into mysql

    最近尝试插入1百万条数据进db,以mysql为例. 1. 顺序insert 先写了个无脑的for循环作为base-line,插1万条耗时1m53s,根本不敢插1百万. foreach(var stud ...

  3. SpinEdit

    用code给value赋值会触发 change事件

  4. Dom事件初步了解

    1.事件流 事件流可以分为两种:事件冒泡和事件捕获 1. 事件冒泡就是从目标元素一直冒泡到根元素html(IE和DOM浏览器都有) 2. 事件捕获就是从根元素到目标元素(DOM浏览器支持) 2.事件处 ...

  5. ie浏览器兼容性快速处理小招

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. AFNetworking、MKNetworkKit和ASIHTTPRequest对比

    之前一直在使用ASIHTTPRequest作为网络库,但是由于其停止更新,iOS7上可能出现更多的问题,于是决定更换网络库. 目前比较流行的网络库主要有AFNetworking和MKNetworkKi ...

  7. hashmap和hashtable,arraylist和vector的区别

    hashmap线程不安全,hashtable线程安全 hashmap允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同. ...

  8. SharePoint 2013 企业搜索架构示例

    博客地址:http://blog.csdn.net/FoxDave 本文参考自微软官方的Chart,我们来看一下企业中对于不同规模SharePoint搜索的场的架构是什么样的. 对于搜索场的规模, ...

  9. Android开发-略讲adb命令和SQLite数据库运用

    adb.exe  ADB -Android Debug Bridge, 是 Android sdk 里的一个工具,用这个工具可以直接操作管理 Android 模拟器或者真实的 Android 设备 简 ...

  10. PHPSESSID的cookie

    如果PHP脚本中有: 1 session_start(); 则说明使用了SESSION. SESSION是一种机制,可以在服务器端跨文件暂时保存数据或传递数据,常用于购物车等方面. SESSION只在 ...