poj3368(RMQ——ST)
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 16543 | Accepted: 5985 |
Description
You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given several queries consisting of indices i and j (1 ≤ i ≤ j ≤ n). For each query, determine the most frequent value among the integers ai , ... , aj.
Input
The input consists of several test cases. Each test case starts with a line containing two integers n and q (1 ≤ n, q ≤ 100000). The next line contains n integers a1 , ... , an (-100000 ≤ ai ≤ 100000, for each i ∈ {1, ..., n}) separated by spaces. You can assume that for each i ∈ {1, ..., n-1}: ai ≤ ai+1. The following q lines contain one query each, consisting of two integers i and j (1 ≤ i ≤ j ≤ n), which indicate the boundary indices for the
query.
The last test case is followed by a line containing a single 0.
Output
For each query, print one line with one integer: The number of occurrences of the most frequent value within the given range.
Sample Input
10 3
-1 -1 1 1 1 1 3 10 10 10
2 3
1 10
5 10
0
Sample Output
1
4
3
Source
分析
#include<cstdio>
#include<iostream>
#include<cmath>
#define MAX 100010
using namespace std;
int f[MAX][];
int num[MAX];
int sum[MAX];
int n,Q,ans,a,b;
int _max(int a,int b)
{
return a>b?a:b;
}
void ST()
{
for(int i=;i<=n;i++)
f[i][]=sum[i];
int k=log((double)(n+))/log(2.0);
for(int i=;i<=k;i++)
for(int j=;j+(<<i)<=n+;j++)//n+1
f[j][i]=_max(f[j][i-],f[j+(<<(i-))][i-]);
}
int RMQ_Query(int l,int r)
{
if(l>r)return ;
int k=log((double)(r-l+))/log(2.0);
return _max(f[l][k],f[r-(<<k)+][k]);//r-(1<<k)一定要+1
}
int main()
{
while(scanf("%d",&n)!=EOF,n)
{
scanf("%d",&Q);
for(int i=;i<=n;i++)
{
scanf("%d",num+i);
if(i==)
{
sum[i]=;
continue;
}
if(num[i]==num[i-])
sum[i]=sum[i-]+;
else sum[i]=;
}
ST();
while(Q--)
{
scanf("%d%d",&a,&b);
if(a==b||num[a]==num[b])
{
cout<<b-a+<<endl;
continue;
}
int t=a;
while(num[t]==num[t-]&&t<=b)//t 必须小于 b
t++;
int cnt=RMQ_Query(t,b);
ans=_max(cnt,t-a);
printf("%d\n",ans);
}
}
return ;
}
poj3368(RMQ——ST)的更多相关文章
- [NOI2010]超级钢琴(RMQ+堆)
小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负 ...
- HDU 5726 GCD(RMQ+二分)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5726 题意:给出一串数字,现在有多次询问,每次询问输出(l,r)范围内所有数的gcd值,并且输出有多 ...
- BZOJ 1067:[SCOI2007]降雨量(RMQ+思维)
http://www.lydsy.com/JudgeOnline/problem.php?id=1067 题意:…… 思路:首先我们开一个数组记录年份,一个记录降雨量,因为年份是按升序排列的,所以我们 ...
- POJ 3419 Difference Is Beautiful(RMQ变形)
题意:N个数,M个询问,每个询问为一个区间,求区间最长连续子序列,要求每个数都不同(perfect sequence,简称PS). 题解:很容易求出以每个数为结尾的ps,也就是求区间的最大值.有一个不 ...
- 2015 多校联赛 ——HDU5289(二分+ST)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- (RMQ版)LCA注意要点
inline int lca(int x,int y){ if(x>y) swap(x,y); ]][x]]<h[rmq[log[y-x+]][y-near[y-x+]+]])? rmq[ ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
- UVA - 1618 Weak Key(RMQ算法)
题目: 给出k个互不相同的证书组成的序列Ni,判断是否存在4个证书Np.Nq.Nr.Ns(1≤p<q<r<s≤k)使得Nq>Ns>Np>Nr或者Nq<Ns&l ...
- CodeForces 689D Friends and Subsequences (RMQ+二分)
Friends and Subsequences 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/H Description Mi ...
随机推荐
- JavaIO之File类
Java-IO之File类 Java-IO之File类 1. File类 1.1. File类说明 1.2. 体验 File 类 1.3. 构造一个 File 类实例: 1.4. 路径: 1.4.1. ...
- char、varchar、nchar、nvarchar的区别
http://www.cnblogs.com/mekong/archive/2009/04/17/1437996.html
- maven项目报:An error occurred while filtering resources
maven项目在problem中报: An error occurred while filtering resources 解决方法: 右键项目-maven-update project..
- 错误的CPU时间片大小概念
1.错误的CPU时间片大小概念:http://blog.csdn.net/blue_morning/article/details/7843581 2.时间片:http://baike.baidu.c ...
- C#获取程序集自动增加的版本号和编译时间
1. 首先找到文件AssemblyInfo.cs, 路径如下: 2. 修改版本的格式,修改后,程序每次编译,程序集的版本号都会自增. 修改前: [assembly: AssemblyVersion(& ...
- JavaBean的toString方法工具类
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r ...
- NSArray转json字符串
func arrayToJson(arr:NSArray) -> String { let jsonData: NSData = try! NSJSONSerialization.dataWit ...
- ORACLE 导出(exp) & 导入(imp)
导出(exp) & 导入(imp) 利用Export可将数据从数据库中提取出来,就是将select的结果存到一个FS二进制文件上 利用Import则可将提取出来的数据送回到Ora ...
- [问题记录.VisualStudio]VS2013无法新增和打开项目
[问题描述] 1) 打开项目失败,报“项目文件只读”或“空引用”错误. 2) 无法新建项目,没有任何可用模板. 3) TFS都正常 [问题产生] 机器环境: 1) 装的Win10双系统,其中一个系统是 ...
- read函数返回值始终为1
部分程序如下: while(count=read(fd_s,buf,512)>0) printf("count=%d\n",count); write(f ...