hdu3308 线段树——区间合并
更新一个点;
求某个区间的最长连续上升序列;
链接: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 线段树——区间合并的更多相关文章
- HDU3308 线段树区间合并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...
- LCIS hdu3308 (线段树 区间合并)
题意: 有两种操作 一种是单点改为b 一种是给出区间ab 区间ab的最大上升子序列个数.. 线段树目前学了三种 第一种单点操作很简单 第二种区域操作加上懒惰标记即可 现在这种 为区间合并. ...
- hdu3308 线段树 区间合并
给n个数字 U表示第A个数改为B.A是从0开始. Q输出最大的递增序列个数. 考虑左边,右边,和最大的. #include<stdio.h> #define lson l,m,rt< ...
- hdu-3308 LCIS (线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
- HYSBZ 1858 线段树 区间合并
//Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...
- poj3667 线段树 区间合并
//Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
随机推荐
- 可滑动的ToggleButton(开关)
2013-12-28 17:25:01 网上看到一篇关于可滑动的ToogleButton的文章,有代码,觉得挺好,但是不符合我的要求,因此在他的代码基础上改了一些.(作者看到了勿喷啊,实在找不到原文了 ...
- Android Support ;v4、v7、v13的区别
google提供了Android Support Library package系列的包来保证来高版本sdk开发的向下兼容性,即我们用4.x开发时,在1.6等版本上,可以使用高版本的有些特性,如fra ...
- SharePoint安全 - SharePoint网站常用页面URL索引
博客地址 http://blog.csdn.net/foxdave 一. 主要网站内容 首页 /default.aspx /Pages/default.aspx 网站设置 /_layouts/sett ...
- iphone/ipod网页开发教程及规则
侦测iPhone/iPod 开发特定设备的移动网站,首先要做的就是设备侦测了.下面是使用Javascript侦测iPhone/iPod的UA,然后转向到专属的URL. if((navigator.us ...
- CSS 3D旋转 hover 后设置transform 是相对于正常位置
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用struts2的<s>标签出错
15:org.apache.struts2.views.jsp.ActionTag 16:JSP 17:18:19:executeResult Server: Resin/3.1.4a Content ...
- 深入分析:Android中app之间的交互(一,使用Action)
在我们开发Android App应用的时候,有些需求需要我们启动其他的App来处理一些逻辑,例如我们需要根据一个地址来调用系统或者相关的地图Map App,这样我们不用在自己的App中编写相应的功能, ...
- int和char的相同和不同。
int和char在存储量上有不同而且在编程的时候,这样才是正确的,如果这样的话,这是一个区别. 第二:这个和上面的道理应该是差不多的.输出97 98. 总的来说,int和char都是一个定义量器的 ...
- __set()与__get() 魔术方法
在面向对象编程的过程中,对于类当中的各个成员变量,都有不同的访问属性,比如公有的(public)属性,在类内部和类外部都可直接调用:而私有的(private)和受保护的(protected),在类外不 ...
- EF中逆变和协变
EF中的增删改查: 实现步骤: 1.声明一个EF的上下文. bjhksjEntities dbContext = new bjhksjEntities(); 2.声明一个实体. HKSJ_USERS ...