思路:

先统计在第i个位置当前数字已经出现的次数。

维护两个数组,一个是当前位置的数字最后一次出现的位置,另一个是当前位置的数字第一次出现的位置

查找的时候分为两种情况:

  1. 没有和边界相交(意会意会)的数字中的最大值,注意右边界一定要不小于左边边界。
  2. 统计一下和边界相交的数字出现的次数… 如果整个区间是一个数的话要特判。
// by SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100005
int n,q,a[maxn],b[maxn],tree[maxn*4],f[maxn],xx,yy,jy,ans,jyx,jyy;
void build(int l,int r,int pos){
if(l==r){tree[pos]=f[l];return;}
int mid=(l+r)/2;
build(l,mid,pos<<1);build(mid+1,r,pos<<1|1);
tree[pos]=max(tree[pos<<1],tree[pos<<1|1]);
}
int query(int l,int r,int pos){
if(l>=jyx&&r<=jyy)return tree[pos];
int mid=(l+r)/2;
if(mid>=jyy)return query(l,mid,pos<<1);
else if(mid<jyx)return query(mid+1,r,pos<<1|1);
else return max(query(l,mid,pos<<1),query(mid+1,r,pos<<1|1));
}
int main(){
while(~scanf("%d",&n)&&n){
scanf("%d",&q);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i!=1&&a[i]==a[i-1])f[i]=f[i-1]+1;
else f[i]=1;
}
jy=n;
for(int i=n-1;i>=1;i--)
if(f[i]==f[i+1]-1)a[i]=jy;
else jy=i,a[i]=i;
jy=1;
for(int i=1;i<=n;i++)
if(f[i+1]==f[i]+1)b[i]=jy;
else b[i]=jy,jy=i+1;
build(1,n,1);
for(int i=1;i<=q;i++){
scanf("%d%d",&xx,&yy);
jyx=a[xx]+1,jyy=b[yy]-1;
if(jyx<=jyy)ans=max(query(1,n,1),max(jyx-xx,yy-jyy));
else if(jyx<=yy&&jyy>=xx)ans=max(jyx-xx,yy-jyy);
else ans=yy-xx+1;
printf("%d\n",ans);
}
}
}

POJ 3368 线段树的更多相关文章

  1. poj 2886 线段树+反素数

    Who Gets the Most Candies? Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12744   Acc ...

  2. poj 3468(线段树)

    http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...

  3. POJ——3264线段树

    题目: 输入两个数(m,n),m表示牛的头数,n表示查询的个数.查询时输入两个数(x,y),表示查询范围的起始值和终止值,查询结果是,这个区间内牛重量的最大值减去牛重量的最小值,数量级为1000,00 ...

  4. POJ 2828 线段树(想法)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 15422   Accepted: 7684 Desc ...

  5. poj 2828 线段树

    http://poj.org/problem?id=2828 学到的思维: 1.变化的或者后来的优先影响前面的,那么从最后一个往前看,最后一个就成了 确定的, 而且后来的也能够确定----假设从前往后 ...

  6. POJ - 1177 线段树

    POJ - 1177 扫描线 这道题也算是一道扫描线的经典题目了. 只不过这道题是算周长,非常有意思的一道题.我们已经知道了,一般求面积并,是如何求的,现在我们要把扫描线进行改造一下,使得能算周长. ...

  7. poj 2886 (线段树+反素数打表) Who Gets the Most Candies?

    http://poj.org/problem?id=2886 一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左 ...

  8. poj 2828(线段树 逆向思考) 插队是不好的行为

    http://poj.org/problem?id=2828 插队问题,n个人,下面n行每行a,b表示这个人插在第a个人的后面和这个人的编号为b,最后输出队伍的情况 涉及到节点的问题可以用到线段树,这 ...

  9. poj 2528(线段树+离散化) 市长的海报

    http://poj.org/problem?id=2528 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ...

随机推荐

  1. iris中间件

    最近使用golang写的时候涉及到权限校验,用中间件(使用iris框架内的东西) 自己摸索出一种自己的方式 iris.UseFunc(MiddlewareFunc)使用这个方法,会在所有的请求之前执行 ...

  2. node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)

    最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. Mongoose是在node.js ...

  3. Spark SQL 编程API入门系列之Spark SQL的作用与使用方式

    不多说,直接上干货! Spark程序中使用SparkSQL 轻松读取数据并使用SQL 查询,同时还能把这一过程和普通的Python/Java/Scala 程序代码结合在一起. CLI---Spark ...

  4. 实现SSRS订阅

    以前曾经搞过SSRS的订阅,使用的是公司的邮件服务器,最近QQ群中有妹子问到同样的问题,虽然没能帮人家搞定,下面写出自己参考的资料,以供各位参考: 一.订阅前准备工作(转载自http://blog.s ...

  5. 理解z-index和css中的层叠顺序问题(大神技术博的读后感?)

    一直对 z-index不太理解,今天看到了大神的博客...http://www.zhangxinxu.com/wordpress/tag/z-index/ 1.层叠上下文:是一个名词!是一个性质!此时 ...

  6. 去除input 在 webkit内核浏览器 选择历史时,有一个黄色背景

    input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset; } http://www.imooc.com/arti ...

  7. ZBrush中如何把模型的细节映射到低模上

    我们在ZBrush®雕刻模型的时候,发现模型布线不利于雕刻,这使我们不得不对模型进行重建细分,而重建细分之后的模型细节已经没有了,这个时候我们就需要把原来高模的细节映射到新的模型上面. 接下来我们介绍 ...

  8. Bzoj 2502: 清理雪道 有上下界网络流_最小流

    好长时间没有写网络流了,感觉好手生.对于本题,设一个源点 $s$ 和 $t$.1.由 $s$ 向每个点连一条没有下界,容量为无限大的边,表示以该点为起点.2.由每个点向 $t$ 连一条没有下界,容量为 ...

  9. HDU 5918 Sequence I

    题目来源:2016 CCPC 长春站 题意:给出两个序列 a[] , b[] ,如果b1,b2....bm能够与aq,aq+p,aq+2p...aq+(m-1)p对应( q+(m-1)p<=n ...

  10. [BOI2007]摩基亚

    题目:洛谷P4390.BZOJ1176. 题目大意: 给你一个\(W\times W\)的矩阵,初始每个数都为\(S\).现在有若干操作: 1. 给某个格子加上一个值:2. 询问某个子矩阵的值的和:3 ...