hdu 3308
终于A了,我好想砍人,虽然这是一道基础的区间合并。但是这错误我也是醉了。
错误我表在注释里。
题目意思不多说,sha崽题目出的很简洁。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int maxn=100010;
int lsum[maxn<<2],rsum[maxn<<2],msum[maxn<<2],p[maxn];
struct node {
int x,y;
} cover[maxn<<2];
void pushup(int l,int r,int rt)
{
cover[rt].x=cover[rt<<1].x;
cover[rt].y=cover[rt<<1|1].y;
lsum[rt]=lsum[rt<<1];
rsum[rt]=rsum[rt<<1|1];
msum[rt]=max(msum[rt<<1],msum[rt<<1|1]);
int mid=(l+r)>>1;
if(cover[rt<<1].y<cover[rt<<1|1].x)
{
if(lsum[rt]==mid-l+1)
lsum[rt]+=lsum[rt<<1|1];
if(rsum[rt]==r-mid)
rsum[rt]+=rsum[rt<<1];
msum[rt]=max(rsum[rt<<1]+lsum[rt<<1|1],msum[rt]);
}
}
void build(int l,int r,int rt)
{
if(l==r)
{
msum[rt]=lsum[rt]=rsum[rt]=1;
cover[rt].x=cover[rt].y=p[l];
return ;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
pushup(l,r,rt) ;
}
void update(int xx,int yy,int l,int r,int rt)
{
if(l==r)
{
cover[rt].x=cover[rt].y=yy;
return ;
}
int mid=(l+r)>>1;
if(xx<=mid)
update(xx,yy,lson);
else
update(xx,yy,rson);
pushup(l,r,rt);
}
int query(int L,int R,int l,int r,int rt)//错就错在这个查找
{
if(L<=l&&r<=R)
return msum[rt];
int mid=(l+r)>>1;
int ans = 0; //就错在这,ans要初始化0
if(L<=mid)ans = query(L,R,lson);
if(R>mid)ans = max ( ans, query(L,R,rson) );
if(cover[rt<<1].y<cover[rt<<1|1].x)ans=max ( ans , min(mid-L+1, rsum[rt<<1])+min(R-mid,lsum[rt<<1|1]) );
return ans;
}
int main()
{
int n,m,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&p[i]);
build(0,n-1,1);
int a,b;
char op[5];
while(m--)
{
scanf("%s%d%d",op,&a,&b);//printf("%d %d\n",a,b);
if(*op=='Q')printf("%d\n",query(a,b,0,n-1,1));
else update(a,b,0,n-1,1);
//for(int i=1;i<=5;i++)printf("%d %d %d %d %d\n",cover[i].x,cover[i].y,lsum[i],rsum[i],msum[i]);
}
}
}
下面我把为什么不把ans初始化的问题写一下。
比如原序列是1 2 3 那么要查找 【1 ,2】 区间的话。
看图

反正意思就差不多这样吧,但是好像图上这种情况是不返回数的,所以ans是系统随机给的一个数。
hdu 3308的更多相关文章
- hdu 3308 最长连续上升区间
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并
看到讲课安排上 线段树有一节课"区间合并" 我是迷茫的 因为并没有见过 然后了解了一下题目 发现以前写过 还是很麻烦的树链剖分 大概是 解决带修改的区间查询"连续问题&q ...
- 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[ ...
- hdu 3308 LCIS(线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others) ...
- HDU 3308 (线段树区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作 : 1 修改 单点 a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...
- 线段树 HDU 3308
t 题目大意:给你n个数,m个操作.操作有两种:1.U x y 将数组第x位变为y 2. Q x y 问数组第x位到第y位连续最长子序列的长度.对于每次询问,输出一个答案 #include< ...
- HDU 3308 LCIS(线段树)
题目链接 模板题吧,忘了好多,终于A了... #include <cstring> #include <cstdio> #include <string> #inc ...
- HDU 3308 LCIS
题意: U A B: 把第A个数变成BQ A B: 输出[A,B]最长连续上升子序列(注意是连续 相当于子串) 思路:单点更新 ,区间合并几下左边开头最小 和右边结束最大的两个数即可. #incl ...
- HDU 3308 LCIS(线段树)
Problem Description Given n integers.You have two operations:U A B: replace the Ath number by B. (in ...
随机推荐
- UValive 5713 Qin Shi Huang's National Road System
Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
- ethtool的基本设置
ethtool是设置网卡属性.IP/TCP相关协议属性的基本工具,功能还是很强大的.ubuntu的版本里没有默认集成,使用apt-get install 安装之.... 使用概要:ethtool et ...
- C++Primer第5版学习笔记(二)
C++Primer第5版学习笔记(二) 第三章的重难点内容 这篇笔记记录了我在学习C++常用基本语法的学习过程,基本只记录一些重难点,对概念的描述不是一开始就详尽和准确的,而是层层深入 ...
- 整数区间及区间集合(C#实现)
/// <summary> /// 整数区间类 /// </summary> private class Interval { , _end = ; public int St ...
- Boxes - SGU 126(找规律)
题目大意:有两个箱子,一个箱子装了A个球,一个箱子装了B个球,可以从球多的那个箱子拿出来球少的箱子里面球的总数放在少的那个箱子里面,问能否把球全部放在一个箱子里面? 分析:很容易求出来最后放的拿一下一 ...
- JVM分代垃圾回收策略的基础概念
由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为什么要分代,如何分代,以及垃圾回收 ...
- C语言中数据类型转换的学习
1. 整型和枚举类型数据的转换 测试代码如下: #include <stdio.h> typedef enum _E_TYPE_T { E_TYPE_1 = -1, E_T ...
- Java菜鸟学习笔记--数组篇(二):数组实例&args实例
基本类型实例 //1.定义一个一维数组,先声明,在分配空间 int []number;//生命,没有初始化,number=null number=new int[5];//初始化为默认值,int默认值 ...
- UVA 10106 (13.08.02)
Product The Problem The problem is to multiply two integers X, Y. (0<=X,Y<10250) The Input T ...
- sonarQube 管理
sonarQube是一个管理代码质量的开放平台,它可以从七个维度检测和扫描代码质量 参考百度文库:http://wenku.baidu.com/view/cba28af9b90d6c85ed3ac67 ...