终于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的更多相关文章

  1. hdu 3308 最长连续上升区间

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并

    看到讲课安排上 线段树有一节课"区间合并" 我是迷茫的 因为并没有见过 然后了解了一下题目 发现以前写过 还是很麻烦的树链剖分 大概是 解决带修改的区间查询"连续问题&q ...

  3. LCIS HDU - 3308 (线段树区间合并)

    LCIS HDU - 3308 Given n integers. You have two operations: U A B: replace the Ath number by B. (inde ...

  4. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

  5. hdu 3308 LCIS(线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others)     ...

  6. HDU 3308 (线段树区间合并)

    http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作  : 1 修改 单点  a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...

  7. 线段树 HDU 3308

    t 题目大意:给你n个数,m个操作.操作有两种:1.U x y 将数组第x位变为y   2. Q x y 问数组第x位到第y位连续最长子序列的长度.对于每次询问,输出一个答案 #include< ...

  8. HDU 3308 LCIS(线段树)

    题目链接 模板题吧,忘了好多,终于A了... #include <cstring> #include <cstdio> #include <string> #inc ...

  9. HDU 3308 LCIS

    题意: U A B: 把第A个数变成BQ A B: 输出[A,B]最长连续上升子序列(注意是连续  相当于子串) 思路:单点更新 ,区间合并几下左边开头最小  和右边结束最大的两个数即可. #incl ...

  10. HDU 3308 LCIS(线段树)

    Problem Description Given n integers.You have two operations:U A B: replace the Ath number by B. (in ...

随机推荐

  1. Linux学习笔记1——Linux的目录结构

    / 是根目录 ~是主目录 bin 存放二进制可执行文件(Is,cat,mkdir等) boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc 存放系统配置文件 home 存放所有 ...

  2. 排序算法简介及其C实现

    排序算法(Sorting Algorithm)是计算机算法的一个组成部分. 排序的目标是将一组数据 (即一个序列) 重新排列,排列后的数据符合从大到小 (或者从小到大) 的次序.这是古老但依然富有挑战 ...

  3. U3D物理碰撞总结

    OnCollisionEnter的触发条件: 1.都有boxcollider组件并且IsTrigger为false 2.主动碰撞的物体要有非运动学刚体组件,被动碰撞的物体有木有都行 3.如果主动碰撞的 ...

  4. c++函数模板声明与定义相分离

    最近在仿写stl,发现stl源码中将模板的声明与定义写在一起实在很不优雅.自己尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义,然后在main函数里包含.h头文件,这样会报链接错误.这是因 ...

  5. Using QEMU for Embedded Systems Development

    http://www.opensourceforu.com/2011/06/qemu-for-embedded-systems-development-part-1/ http://www.opens ...

  6. hdoj 1686 Oulipo【求一个字符串在另一个字符串中出现次数】

    Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  7. list去除重复

    1. [代码][Python]代码 简单去重      ? 1 2 3 4 5 l = [1,2,3,3] l = list(set(l))   >>>l >>>[ ...

  8. maven tomcat1.7环境下构建javaweb 项目

    tomcat用户权限设置 在tomcat安装路径\conf目录下tomcat-users.xml添加: <role rolename="admin-gui"/> < ...

  9. ReentrantLock与synchronized的差别

    总的来说,lock更加灵活. 主要同样点:Lock能完毕synchronized所实现的全部功能 不同: 1.ReentrantLock功能性方面更全面,比方时间锁等候,可中断锁等候,锁投票等,因此更 ...

  10. linux lsof命令详解

    linux lsof命令详解 简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访 ...