HDU 3308 LCIS(线段树单点更新区间合并)
LCIS
Given n integers.
You have two operations:
U A B: replace the Ath number by B. (index counting from 0)
Q A B: output the length of the longest consecutive increasing subsequence (LCIS) in [a, b].
Input
Output
Sample Input
Sample Output
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=;
const double eps=0.00000001;
const int maxn=;
struct node
{
int le,ri,len;
int lenum,rinum;
int maxlis,lelis,rilis;
}tree[*maxn];
int elem[maxn];
void pushup(int id)
{
node& fa=tree[id]; //父亲
node& lson=tree[id*]; // 左儿子
node& rson=tree[id*+]; //右儿子
fa.lelis=lson.lelis, fa.rilis=rson.rilis; //更新
fa.lenum=lson.lenum, fa.rinum=rson.rinum;
fa.maxlis=max(lson.maxlis,rson.maxlis); //左右儿子中的最大值
if(lson.rinum<rson.lenum) //如果中间可以形成上升的连续的一段
{
if(lson.lelis==lson.len) fa.lelis+=rson.lelis; //可扩展
if(rson.rilis==rson.len) fa.rilis+=lson.rilis;
fa.maxlis=max(fa.maxlis,lson.rilis+rson.lelis); //最大值更新
}
}
void build_tree(int le,int ri,int id)
{
node& t=tree[id];
t.le=le,t.ri=ri,t.len=ri-le+;
if(le==ri)
{
t.lenum=t.rinum=elem[le];
t.maxlis=t.lelis=t.rilis=;
return;
}
int mid=(le+ri)/;
build_tree(le,mid,id*);
build_tree(mid+,ri,id*+);
pushup(id);
}
int query(int x,int y,int id)
{
if(tree[id].le>=x&&tree[id].ri<=y)
{
return tree[id].maxlis;
}
int mid=(tree[id].le+tree[id].ri)/;
int ret=;
if(x<=mid) ret=max(ret,query(x,y,id*)); //左边
if(y>mid) ret=max(ret,query(x,y,id*+));// 右边
if(tree[id*].rinum<tree[id*+].lenum) ret=max(ret,min(mid-x+,tree[id*].rilis)+min(y-mid,tree[id*+].lelis));//中间
return ret;
}
void update(int id,int pos,int val)
{
if(tree[id].le==tree[id].ri)
{ tree[id].lenum=tree[id].rinum=val; //单点更新
return;
}
int mid=(tree[id].le+tree[id].ri)/;
if(pos<=mid) update(id*,pos,val);
else update(id*+,pos,val);
pushup(id);
}
int main()
{
int T;
cin>>T;
while(T--)
{
int N,M;
cin>>N>>M;
for(int i=;i<=N;i++) scanf("%d",&elem[i]);
build_tree(,N,);
while(M--)
{
char S[];
int from,to;
scanf("%s%d%d",S,&from,&to);
if(S[]=='Q') printf("%d\n",query(from+,to+,));
else update(,from+,to);
}
}
return ;
}
HDU 3308 LCIS(线段树单点更新区间合并)的更多相关文章
- POJ 2892 Tunnel Warfare(线段树单点更新区间合并)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7876 Accepted: 3259 D ...
- hdu1540之线段树单点更新+区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- hdu 5316 Magician(2015多校第三场第1题)线段树单点更新+区间合并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5316 题意:给你n个点,m个操作,每次操作有3个整数t,a,b,t表示操作类型,当t=1时讲a点的值改 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- hdu 1166线段树 单点更新 区间求和
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...
- hdu1166(线段树单点更新&区间求和模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:中文题诶- 思路:线段树单点更新,区间求和模板 代码: #include <iost ...
- hdu 2795 Billboard 线段树单点更新
Billboard Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=279 ...
随机推荐
- Static用法
一.Static全局变量和全局变量的区别 1)全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式. 这两者在存储 ...
- linux find命令-print0和xargs中-0使用技巧(转载)
本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需要的朋友参考下. 本节内容:linux find命令中-print0和xargs中-0的用法 ...
- 判断包含字符String.contains
Java String.contains()方法用法实例教程, 返回true,当且仅当此字符串包含指定的char值序列 java.lang.String.contains() 方法返回true,当且仅 ...
- Ant-进阶
Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译Linux内核及一些软件的源程序时,经常要用这个命令.Make命令其实 ...
- Java并发框架——AQS堵塞队列管理(一)——自旋锁
我们知道一个线程在尝试获取锁失败后将被堵塞并增加等待队列中,它是一个如何的队列?又是如何管理此队列?这节聊聊CHL Node FIFO队列. 在谈到CHL Node FIFO队列之前,我们先分析这样 ...
- 【Struts2】新建一个Struts2工程,初步体验MVC
实现目标 地址栏输入http://localhost:88/Struts2HelloWorld/helloworld.jsp 输入用户名,交由http://localhost:88/Struts2He ...
- NET基础课--泛型(NET之美)
1.泛型,类型或方法的一种抽象概括. 2.泛型类:在类型名后面加一个<>,其中传递占位符,也就是类型参数.where是类型约束 可以再查资料 public class SortHelper ...
- NET基础课--NET的一些概念0
0.CIL--公共中间语言 VC++:经过预编译,编译,汇编和链接生成本地可执行代码,支持它运行的是OS和本地cpu指令集. C#: 在.net框架下类似c#的高级语言经过编译生成的文件叫程序集 ...
- HTML5+CSS3项目总结
经过一个月的学习,我基本掌握了HTML5的一些标签的用法和特性,以及一些CSS3的属性的特点和用法. 在本周安排的为期四天的第一阶段的课程的项目实训中,我基本能够熟练运用学到的知识,完成页面的速度 ...
- SpringMvc学习-增删改查
本节主要介绍SpringMVC简单的增删改查功能. 1.查询 dao中的代码 public List<WeatherPojo> getAllWeather(){ String sql=&q ...