POJ3368 Frequent values(RMQ线段树)
题目大概说给一个递增序列,询问区间出现最多的数。
用莫队算法比较直观,虽然应该会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线段树)的更多相关文章
- poj3368 Frequent values(线段树)
Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In ad ...
- POJ_3368 Frequent values 【线段树+区间查询】
一.题面 POJ3368 二.分析 仍然是一道只需要区间查询不需要区间修改的线段树题. 这题的题面比较特别,它是一组非减的数组.当需要去找一段区间内出现次数最多的数字时,这些数字必然是连续的,那么就可 ...
- Frequent values(线段树+离散化)
http://poj.org/problem?id=3368 题意:给出一个非降序排列的整数数组,对于询问(i,j),输出区间[i,j]中出现最多的值的次数. 思路:经典的RMQ,不过我用线段树做的. ...
- POJ 3368:Frequent values(线段树区间合并)
题目大意,给出一段非降序列,求一些区间中出现频率最高的数的出现次数. 分析: 显然,区间中一个数多次出现必然是连续的,也就是最长的连续相等的一段. 用线段树解决,维护三个信息:一个区间最长连续的区间的 ...
- POJ 3368 Frequent values(线段树区间合并)
[题目链接] http://poj.org/problem?id=3368 [题目大意] 有一个有序序列,要求区间查询出现次数最多的数 [题解] 维护每个区间左端点和右端点,以及左右的长度,还有区间的 ...
- [poj3368]Frequent values(rmq)
题意:给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之间连续出现次数最多的次数. 解题关键:统计次数,转化为RMQ问题,运用st表求解,注意边界. 预处理复杂度:$O(n\log n)$ ...
- POJ 3368 Frequent values RMQ ST算法/线段树
Frequent values Time Limit: 2000MS Memory Lim ...
- RMQ算法 以及UVA 11235 Frequent Values(RMQ)
RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8) 内的最大值.数据量小 ...
- NBU 2475 Survivors(RMQ线段树)
NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...
- [RMQ] [线段树] POJ 3368 Frequent Values
一句话,多次查询区间的众数的次数 注意多组数据!!!! RMQ方法: 预处理 i 及其之前相同的数的个数 再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同 ...
随机推荐
- Linuxc:创建与监控多个子进程
#include <unistd.h> #include <sys/types.h> #include <stdlib.h> #include <signal ...
- zTree控件的使用
最常用的使用方式是json格式 .net递归实现对象生成json格式字符串 代码: using System; using System.Collections.Generic; using Syst ...
- Delphi ini文件读写
参考:http://www.cnblogs.com/zhangzhifeng/archive/2011/12/01/2270267.html 一.ini文件的结构 ;这是关于 ini 文件的注释 [节 ...
- Codeforces Round #364 As Fast As Possible
二分思想,对所要花费的时间进行二分,再以模拟的形式进行验证是否可行. 使用二分法,可以将一个求最优解的问题转化为一个判定问题,优雅的暴力. #include<cstdio> #includ ...
- 攻城狮在路上(肆)How tomcat works(一) 简单的web服务器
该节总共三个类:Request\Response\HttpServer---user.dir 该节的目的是实现简单web服务器对静态文件的访问.需要对请求头.请求体的格式有所了解,不然就没有 ...
- Beego框架使用
go get github.com/astaxie/beego vim hello.go package main import "github.com/astaxie/beego" ...
- Win10 开发者模式开启
使用注册表方式:建立一个注册表DWORD为1键值:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock\AllowAllTrust ...
- phpcms v9网站搬家更换域名的方法
PHPCMS 是国内领先的网站管理系统,同时也是一个开源的PHP开发框架. 本文介绍phpcms v9网站搬家更换域名的方法. 1.在新的主机空间把phpcms安装好. 新安装的版本一定要和准备搬迁的 ...
- hdu 4731 2013成都赛区网络赛 找规律
题意:找字串中最长回文串的最小值的串 m=2的时候暴力打表找规律,打表可以用二进制枚举
- C 和 C++ 混合代码 cmath编译出错
最近在网上下载了 Triangle 库,准备在程序中调用来三角化生成网格,但出现了很多错误,如下: 1> triangle.c1>d:\program files\visualstudi ...