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 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ...
随机推荐
- Oracle 查看锁定表用户的SQL
#描述:当执行如下SQL select * From XXX for Updata 发现表“XXX”被锁定 #只需要执行如下SQL 查看锁定该表的用户 SELECT object_name, mach ...
- 9-21 调试javaweb 数据库连接感想
如何找bug 一步步调试 数据库链接写一个简单的 test 数据库操作 sql语句 写一个类 测试一下 不要忽略细节 最后页面的显示 html "/head"少一个"/& ...
- Ubuntu14.04下初步使用MongoDB
不多说,直接上干货! Ubuntu14.04下Mongodb(在线安装方式|apt-get)安装部署步骤(图文详解)(博主推荐) shell命令模式 输入mongo进入shell命令模式,默认连接的数 ...
- BI中事实表与维度表的定义
一个典型的例子是,把逻辑业务比作一个立方体,产品维.时间维.地点维分别作为不同的坐标轴,而坐标轴的交点就是一个具体的事实.也就是说事实表是多个维度表的一个交点.而维度表是分析事实的一个窗口. 首先介绍 ...
- 高并发之后端优化(PHP)
页面静态化 使用模板引擎 可以使用Smarty的缓存机制生成静态HTML缓存文件 $smarty->cachedir=$ROOT·"/cache"://缓存目录 $smart ...
- vue中使用Ueditor编辑器 -- 1
一. 下载包: 从Ueditor的官网下载1.4.3.3jsp版本的Ueditor编辑器,官网地址为:http://ueditor.baidu.com/website/download.html ...
- ddk安装失败后的处理
7600.16385.1版本的DDK,在xp的本上死活按不上,怎么办呢?自己就把其他机器上安装的DDK目录,拷贝过来. 怎么建编译环境呢? 查看x86 Checked Build Environmen ...
- Codeforces Round #499 (Div. 2) D. Rocket_交互题_二分
第一次作交互题,有点不习惯. 由于序列是循环的,我们可以将一半的机会用于判断当前是否是在说谎,另一半的机会用于二分的判断. 对于判断是否实在说谎,用1判断即可.因为不可能有比1还小的数. 本题虽然非常 ...
- MySQL ERROR 1366(HY000) Incorrect string value
有以下两张表: mysql> show tables; +---------------+ | Tables_in_old | +---------------+ | book | | pres ...
- 树莓派搭建 Google TV
出处:http://my.oschina.net/funnky/blog/142067 树莓派搭建 Google TV 目录:[ - ] Google TV是啥玩意 ? 搭建我们自己的Google T ...