题目大概说给一个递增序列,询问区间出现最多的数。

用莫队算法比较直观,虽然应该会T。。好像也可以主席树。。不过题目给的序列是有序的,因而相同的数会聚在一起。

考虑把序列分成一段一段,使每段都包含极大的相同的数字

这样对于每一个区间查询:

    • 可能这个区间左边或右边没有包含完整的一段,而其长度在段里对左或右端点进行二分查找就知道了
    • 而除去两边不完整的,还要求出中间若干完整段的最大长度,这个就是用RMQ来快速解决了

于是这题就能这样解决了。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 222222 int lrec[MAXN],rrec[MAXN]; int tree[MAXN<<],N,x,y;
void update(int i,int j,int k){
if(i==j){
tree[k]=y;
return;
}
int mid=i+j>>;
if(x<=mid) update(i,mid,k<<);
else update(mid+,j,k<<|);
tree[k]=max(tree[k<<],tree[k<<|]);
}
int query(int i,int j,int k){
if(x>y) return ;
if(x<=i && j<=y){
return tree[k];
}
int mid=i+j>>,res=;
if(x<=mid) res=max(res,query(i,mid,k<<));
if(y>mid) res=max(res,query(mid+,j,k<<|));
return res;
} int seq[MAXN];
int main(){
int n,q,a,b;
while(~scanf("%d",&n) && n){
scanf("%d",&q);
for(int i=; i<=n; ++i){
scanf("%d",seq+i);
}
seq[n+]=; int rn=;
lrec[]=;
for(int i=; i<=n+; ++i){
if(seq[i]!=seq[i+]){
rrec[rn]=i;
rn++;
lrec[rn]=i+;
}
} memset(tree,,sizeof(tree));
for(N=; N<rn; N<<=);
for(int i=; i<rn; ++i){
x=i; y=rrec[i]-lrec[i]+;
update(,N-,);
} int i,j,res;
while(q--){
scanf("%d%d",&a,&b);
i=lower_bound(rrec,rrec+rn,a)-rrec;
j=upper_bound(lrec,lrec+rn,b)-lrec-;
if(rrec[i]>=b){
printf("%d\n",b-a+);
continue;
}
res=max(rrec[i]-a+,b-lrec[j]+);
x=i+; y=j-;
res=max(res,query(,N-,));
printf("%d\n",res);
}
}
return ;
}

POJ3368 Frequent values(RMQ线段树)的更多相关文章

  1. poj3368 Frequent values(线段树)

    Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In ad ...

  2. POJ_3368 Frequent values 【线段树+区间查询】

    一.题面 POJ3368 二.分析 仍然是一道只需要区间查询不需要区间修改的线段树题. 这题的题面比较特别,它是一组非减的数组.当需要去找一段区间内出现次数最多的数字时,这些数字必然是连续的,那么就可 ...

  3. Frequent values(线段树+离散化)

    http://poj.org/problem?id=3368 题意:给出一个非降序排列的整数数组,对于询问(i,j),输出区间[i,j]中出现最多的值的次数. 思路:经典的RMQ,不过我用线段树做的. ...

  4. POJ 3368:Frequent values(线段树区间合并)

    题目大意,给出一段非降序列,求一些区间中出现频率最高的数的出现次数. 分析: 显然,区间中一个数多次出现必然是连续的,也就是最长的连续相等的一段. 用线段树解决,维护三个信息:一个区间最长连续的区间的 ...

  5. POJ 3368 Frequent values(线段树区间合并)

    [题目链接] http://poj.org/problem?id=3368 [题目大意] 有一个有序序列,要求区间查询出现次数最多的数 [题解] 维护每个区间左端点和右端点,以及左右的长度,还有区间的 ...

  6. [poj3368]Frequent values(rmq)

    题意:给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之间连续出现次数最多的次数. 解题关键:统计次数,转化为RMQ问题,运用st表求解,注意边界. 预处理复杂度:$O(n\log n)$ ...

  7. POJ 3368 Frequent values RMQ ST算法/线段树

                                                         Frequent values Time Limit: 2000MS   Memory Lim ...

  8. RMQ算法 以及UVA 11235 Frequent Values(RMQ)

    RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8)  内的最大值.数据量小 ...

  9. NBU 2475 Survivors(RMQ线段树)

    NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...

  10. [RMQ] [线段树] POJ 3368 Frequent Values

    一句话,多次查询区间的众数的次数 注意多组数据!!!! RMQ方法: 预处理 i 及其之前相同的数的个数 再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同 ...

随机推荐

  1. Redis事件管理(一)

    Redis统一的时间管理器,同时管理文件事件和定时器, 这个管理器的定义: #if defined(__APPLE__) #define HAVE_TASKINFO 1 #endif /* Test ...

  2. eclipse clear swtich workspace

    edit : --> D:\tools\eclipse\configuration\.settings\org.eclipse.ui.ide.prefs

  3. C#值类型与引用类型

    值类型(Value Type),值类型实例通常分配在线程的堆栈(stack)上,并且不包含任何指向实例数据的指针,因为变量本身就包含了其实例数据.其在MSDN的定义为值类型直接包含它们的数据,值类型的 ...

  4. JavaScript 火花效果

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  5. 设计模式学习之适配器模式(Adapter,结构型模式)(14)

    参考链接:http://www.cnblogs.com/zhili/p/AdapterPattern.html一.定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼 ...

  6. Nginx详解(一)

    1.Nginx是什么? Nginx就是反向代理服务器. 首先我们先来看看什么是代理服务器,代理服务器一般是指局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端.比如Go ...

  7. Bootstrap简介

    接下来的一段时间,想研究一下现有的网页框架,第一个不容错过的就是Bootstrap,Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CS ...

  8. Session 类

     Session 类 Session 类可以使用户在浏览您的网站时,维持他们的状态并跟踪他们的行为. Session 类将每个用户的 session 信息序列化(serialize)后存储到到 coo ...

  9. C语言中的static 详细分析

    转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...

  10. xcrun: error: active developer path ("/XX") does not exist

    MAC OS 10.9下执行命令 svn --version 报出如下错误: xcrun: error: active developer path ("/Users/username/Do ...