LCIS hdu3308 (线段树 区间合并)
题意: 有两种操作 一种是单点改为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 (线段树 区间合并)的更多相关文章
- HDU3308 线段树区间合并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...
- (简单) HDU 3308 LCIS,线段树+区间合并。
Problem Description Given n integers. You have two operations: U A B: replace the Ath number by B. ( ...
- LCIS(线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- hdu 3308 LCIS(线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others) ...
- hdu3308 线段树——区间合并
更新一个点: 求某个区间的最长连续上升序列: 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 #include <cstdio> #in ...
- 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 ...
- LCIS HDU - 3308 (线段树区间合并)
LCIS HDU - 3308 Given n integers. You have two operations: U A B: replace the Ath number by B. (inde ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
随机推荐
- 【bzoj2877】 Noi2012—魔幻棋盘
http://www.lydsy.com/JudgeOnline/problem.php?id=2877 (题目链接) 题意 一个${n*m}$的矩阵,维护两个操作:给任意子矩阵${+val}$:问某 ...
- 踩坑记(1)——使用slf4j+logback记录日志
刚开始的jar包版本如下,因为选择jar包版本不同导致的一些坑,踩过了就记录下来: <spring.version>3.1.0.RELEASE</spring.version> ...
- 手动生成moc文件
在VS中写Qt项目时,手动添加了一个类,由于要用到信号槽,所以需要生成相应的moc文件.写好信号槽以后,在类里面第一行应该写上Q_OBJECT关键字,编译项目会提示无法找到moc_XXX.cpp文件. ...
- NIO[读]、[写]在同一线程(单线程)中执行,让CPU使用率最大化,提高处理效率
前几天写过一篇文章,讨论重写服务后,用ab进行压力测试,发现使用NIO后没提高什么性能,只是CPU使用率提高了,内存占用降低了. 之前的NIO实现模式,主要参考(基于事件的NIO多线程服务器)http ...
- C#string与stringBuilder的区别
string的缺点是每次字符串变量的内容发生了改变时,都必须重新分配内存.你想想,如果创建一个迭代100000次的循环,每次迭代都将一个字符连接到字符串,这样内存中就会有100000个字符串,每个字符 ...
- WebSockets Tutorial(教程一)WebSockets简介
一.WebSockets简介 以字面意思来说,握手可以被定义为两个人抓住和握手右手,象征着问候,祝贺,同意或告别.在计算机科学中,握手是确保服务器与客户端同步的过程.握手是Web Socket协议的基 ...
- es6笔记(1) 概要
什么是ES6 ECMAScript 6.0 (简称ES6) 是继ECMAScript 5.1以后的javascript 语言的下一代标准,在2015年6月份发布. 他的目标是使javascript语言 ...
- 第7月第26天 iOS httpserver
1. cocoahttpserver 1)httpserver [httpServer start:&error] 2)HTTPConnection [newConnection start] ...
- HTTP协议之响应头Date与Age
HTTP没有为用户提供一种手段来区分响应是缓存命中的,还是访问原始服务器得到的.客户端有一种方法能判断响应是否来自缓存,就是使用Date首部.将响应中Date首部的值与当前时间进行比较,如果响应中的日 ...
- 字符串对象的charAt函数存在的意义
var style = ""; style[0] //undefined var style = ""; style.charAt(0); //"&q ...