思路:

先统计在第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. Windows远程桌面和360

    Windows的远程桌面输错了一次密码, 然后就怎么都连接不上了, 查了半天发现 傻缺360会默认屏蔽Windows的远程桌面和数据库连接..... 大家没事都卸载了360吧

  2. SwipeRefreshLayout的使用,下拉刷新

    1. <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android ...

  3. Uva 11324 The Largest Clique【强连通 DAG动规 spfa】

    白书上的例题 做一遍tarjan后,缩点,每一个scc节点的权为它的结点数,做一次DAG上的动规,求出路径上的最大点权和,就可以了 #include<cstdio> #include< ...

  4. Java语言特点与学习

    Java语言是一款面向对象的一款高级语言是由Sun Microsystems公司(现已被oracle公司收购).由James Gosling和同事们共同研发,并在1995年正式推出,据oracle官方 ...

  5. CF992E Nastya and King-Shamans_线段树

    Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 200000 ...

  6. [读书笔记] R语言实战 (三) 图形初阶

    创建图形,保存图形,修改特征:标题,坐标轴,标签,颜色,线条,符号,文本标注. 1. 一个简单的例子 #输出到图形到pdf文件 pdf("mygrapg.pdf") attach( ...

  7. [读书笔记] Python 数据分析 (八)画图和数据可视化

    ipython3 --pyplot pyplot: matplotlib 画图的交互使用环境

  8. ansible shell模块

    [root@ftp:/root] > ansible ansible01 -u root -k -m shell -a 'hostname' SSH password: ansible01 | ...

  9. Git 合并流程

    首先把自己的代码提交到自己的分支 再把master[主分支]的代码拉下来更新 解决冲突 推送至自己的分支 请求合并到master[主分支]

  10. 监控myserver计数器