POJ 3368 线段树
思路: 
先统计在第i个位置当前数字已经出现的次数。 
维护两个数组,一个是当前位置的数字最后一次出现的位置,另一个是当前位置的数字第一次出现的位置 
查找的时候分为两种情况:
- 没有和边界相交(意会意会)的数字中的最大值,注意右边界一定要不小于左边边界。
- 统计一下和边界相交的数字出现的次数… 如果整个区间是一个数的话要特判。
// 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 线段树的更多相关文章
- poj 2886 线段树+反素数
		Who Gets the Most Candies? Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12744 Acc ... 
- poj 3468(线段树)
		http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ... 
- POJ——3264线段树
		题目: 输入两个数(m,n),m表示牛的头数,n表示查询的个数.查询时输入两个数(x,y),表示查询范围的起始值和终止值,查询结果是,这个区间内牛重量的最大值减去牛重量的最小值,数量级为1000,00 ... 
- POJ 2828 线段树(想法)
		Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 15422 Accepted: 7684 Desc ... 
- poj 2828 线段树
		http://poj.org/problem?id=2828 学到的思维: 1.变化的或者后来的优先影响前面的,那么从最后一个往前看,最后一个就成了 确定的, 而且后来的也能够确定----假设从前往后 ... 
- POJ - 1177 线段树
		POJ - 1177 扫描线 这道题也算是一道扫描线的经典题目了. 只不过这道题是算周长,非常有意思的一道题.我们已经知道了,一般求面积并,是如何求的,现在我们要把扫描线进行改造一下,使得能算周长. ... 
- poj 2886 (线段树+反素数打表)  Who Gets the Most Candies?
		http://poj.org/problem?id=2886 一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左 ... 
- poj 2828(线段树 逆向思考) 插队是不好的行为
		http://poj.org/problem?id=2828 插队问题,n个人,下面n行每行a,b表示这个人插在第a个人的后面和这个人的编号为b,最后输出队伍的情况 涉及到节点的问题可以用到线段树,这 ... 
- poj 2528(线段树+离散化) 市长的海报
		http://poj.org/problem?id=2528 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ... 
随机推荐
- iris中间件
			最近使用golang写的时候涉及到权限校验,用中间件(使用iris框架内的东西) 自己摸索出一种自己的方式 iris.UseFunc(MiddlewareFunc)使用这个方法,会在所有的请求之前执行 ... 
- node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)
			最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. Mongoose是在node.js ... 
- Spark SQL 编程API入门系列之Spark SQL的作用与使用方式
			不多说,直接上干货! Spark程序中使用SparkSQL 轻松读取数据并使用SQL 查询,同时还能把这一过程和普通的Python/Java/Scala 程序代码结合在一起. CLI---Spark ... 
- 实现SSRS订阅
			以前曾经搞过SSRS的订阅,使用的是公司的邮件服务器,最近QQ群中有妹子问到同样的问题,虽然没能帮人家搞定,下面写出自己参考的资料,以供各位参考: 一.订阅前准备工作(转载自http://blog.s ... 
- 理解z-index和css中的层叠顺序问题(大神技术博的读后感?)
			一直对 z-index不太理解,今天看到了大神的博客...http://www.zhangxinxu.com/wordpress/tag/z-index/ 1.层叠上下文:是一个名词!是一个性质!此时 ... 
- 去除input 在 webkit内核浏览器 选择历史时,有一个黄色背景
			input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset; } http://www.imooc.com/arti ... 
- ZBrush中如何把模型的细节映射到低模上
			我们在ZBrush®雕刻模型的时候,发现模型布线不利于雕刻,这使我们不得不对模型进行重建细分,而重建细分之后的模型细节已经没有了,这个时候我们就需要把原来高模的细节映射到新的模型上面. 接下来我们介绍 ... 
- Bzoj 2502: 清理雪道 有上下界网络流_最小流
			好长时间没有写网络流了,感觉好手生.对于本题,设一个源点 $s$ 和 $t$.1.由 $s$ 向每个点连一条没有下界,容量为无限大的边,表示以该点为起点.2.由每个点向 $t$ 连一条没有下界,容量为 ... 
- 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 ... 
- [BOI2007]摩基亚
			题目:洛谷P4390.BZOJ1176. 题目大意: 给你一个\(W\times W\)的矩阵,初始每个数都为\(S\).现在有若干操作: 1. 给某个格子加上一个值:2. 询问某个子矩阵的值的和:3 ... 
