更新一个点;

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

链接: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. 算法导论-钢条切割 C# 递归实现

    下班前看到有位兄弟写 钢条切割问题,尝试实现C#版, 还没有实现最优版,分享一下. int[] parr; private void button1_Click(object sender, Even ...

  2. C++-bool的值

    /////////////////////////////////////////////////////////////////////////////// // // FileName : boo ...

  3. Linux-设置环境变量

    一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在“ /opt/au1200_rm/build_tools/bin”目录下, ...

  4. dbcp连接池配置参数

    1.<!-- 数据源1 --> 2. <bean id="dataSource" 3. class="org.apache.commons.dbcp.B ...

  5. AS启动模拟器报'mksdcard.exe' is missing from the SDK tools folder.异常、启动模拟器失败

    这个问题是因为SDK下的tools文件夹中找不到mksdcard.exe程序所以无法启动模拟器,下载android-sdk_r20-windows.zip压缩包解压缩后将tools文件覆盖到SDK的t ...

  6. poj2264 dp+路径

    //Accepted 208K 0MS //dp //最长公共子序列+路径 #include <cstdio> #include <cstring> #include < ...

  7. 团队博客——Sprint计划会议1

    每日Scrum:第一天 会议时间:4.14.晚八点半 会议地点:基础教学楼一楼大厅 小组成员:郭庆樑,林彦汝,张金 认领人—使团队成员分工合作,保持团队的积极性. ID 名称(NAME) 重要性(IM ...

  8. hdu 2051

    ps:这道题是题目坑爹了...题目说不考虑n=0的...但其实要考虑...醉了 中文意思:输入一个10进制的数,输出他的二进制数 代码: #include "stdio.h"int ...

  9. 0911 Socket网络编程

    1.实现ftp上传.下载功能 1.1 循环接收数据直到接收完毕 server端接收client发送的命令(比如说ifconfig),然后server端将命令执行结果反馈给客户端,这时候有个问题,ser ...

  10. 基于HTML5+CSS3的图片旋转、无限滚动、文字跳动特效

    本文分享几种基于HTML5+CSS3实现的一些动画特效:图片旋转.无限滚动.文字跳动;实现起来均比较容易,动手来试试! 一.图片旋转 效果图如下: 这个效果实现起来其实并不困难.代码清单如下: < ...