RMQ(连续相同最大值)
http://poj.org/problem?id=3368
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 24727 | Accepted: 8612 |
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 <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <algorithm>
#include <iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include <stdio.h>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e5 + ;
const int M = 1e5 + ;
int dp[N][] , a[N] , b[N] ;//b数组统计连续相同个数
int n , q ; void RMQ()
{
for(int i = ; i <= n ; i++)
{
dp[i][] = b[i];
}
for(int j = ; j < ; j++)
{
for(int i = ; i <= n ; i++)
{
if(i + ( << j) - <= n)
{
dp[i][j] = max(dp[i][j-] , dp[i+(<<(j-))][j-]);
}
}
} } int query(int l , int r)
{
if(r < l) return ;//这个条件不能少,如果查询左右端点相等时,l将大于r
int ans = ;
int k = (int)log2(r - l + );
ans = max(dp[l][k] , dp[r - ( << k) + ][k]);
return ans ;
} int main()
{ while(~scanf("%d" , &n) && n)
{ scanf("%d" , &q);
//init();
for(int i = ; i <= n ; i++)
{
scanf("%d" , &a[i]);
b[i] = ;
}
for(int i = ; i <= n ; i++)
{
if(a[i] == a[i-])
{
b[i] = b[i-] + ;
}
else
{
b[i] = ;
}
}
RMQ();
for(int i = ; i <= q ; i++)
{
int l , r , ans = ;
scanf("%d%d" , &l , &r);
int t = l ;
while(t <= r && a[t] == a[t-])//以防左端点被截断
{
t++;
}
ans = max(t - l , query(t , r));//左端点被截断的话,需要用值减去下标
printf("%d\n" , ans);
} } return ;
}
线段树
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <algorithm>
#include <iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include <stdio.h>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e5 + ;
const int M = 1e5 + ;
int dp[N][] , a[N] , b[N] ;//b数组统计连续相同个数
int n , q , k = , ans = ; struct node{
int l , r , val ;
}tree[N << ]; void build(int l , int r , int root)
{
tree[root].l = l , tree[root].r = r ;
if(l == r)
{
tree[root].val = b[k++];
// cout << root << " " << tree[root].val << endl ;
return ;
}
int mid = (l + r) >> ;
build(l , mid , root*);
build(mid+ , r , root*+);
tree[root].val = max(tree[root*].val , tree[root*+].val);
} void query(int l , int r , int root)
{
if(r < l)
return ;
if(tree[root].l >= l && tree[root].r <= r)
{
ans = max(tree[root].val , ans) ;
return ;
}
int mid =(tree[root].l + tree[root].r) >> ;
if(l <= mid)
query(l , r , root*);
if(r > mid)
query(l , r , root*+);
} int main()
{ while(~scanf("%d" , &n) && n)
{ scanf("%d" , &q);
//init();
for(int i = ; i <= n ; i++)
{
scanf("%d" , &a[i]);
b[i] = ;
}
for(int i = ; i <= n ; i++)
{
if(a[i] == a[i-])
{
b[i] = b[i-] + ;
}
else
{
b[i] = ;
}
}
// memset(tree , 0 ,sizeof(tree));
k = ;
build( , n , );
for(int i = ; i <= q ; i++)
{
int l , r , sum = ;
scanf("%d%d" , &l , &r);
int t = l ;
while(t <= r && a[t] == a[t-])//以防左端点被截断
{
t++;
}
query(t , r , ); sum = max(ans , t - l);
printf("%d\n" , sum);
ans = ;
} } return ;
}
RMQ(连续相同最大值)的更多相关文章
- SPOJ - GSS1-Can you answer these queries I 线段树维护区间连续和最大值
SPOJ - GSS1:https://vjudge.net/problem/SPOJ-GSS1 参考:http://www.cnblogs.com/shanyr/p/5710152.html?utm ...
- uva 11235 RMQ范围最大值
题目大意:给一个整数上升序列,对于一系列询问区间(i,j),回答这段区间出现次数最多值所出现的次数. 分析:一个上升序列,相同的值聚集在一起,把相同的值的区间看作一个整体,假设这样的整体有n个,把他们 ...
- Can you answer these queries I SPOJ - GSS1 (线段树维护区间连续最大值/最大连续子段和)
You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A query is defi ...
- POJ 3419 Difference Is Beautiful (DP + 二分 + rmq)
题意:给n个数(n<=200000),每个数的绝对值不超过(10^6),有m个查询(m<=200000),每次查询区间[a,b]中连续的没有相同数的的最大长度. 析:由于n太大,无法暴力, ...
- HDU 1540 / POJ 2892 Tunnel Warfare (单点更新,区间合并,求包含某点的最大连续个数)
题意:一条线上有n个点,D x是破坏这个点,Q x是表示查询x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 思路:这题的关键是查询. 将被毁的村庄看成空位,当查询某个点的时候,如果我们知道它左 ...
- HDU 5289 Assignment(2015 多校第一场二分 + RMQ)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- Hlg 1832 【线段树 && RMQ】.cpp
题意: 在给出的区间内求出最大买进卖出的差价. 思路: 对于弱数据:维护一个从左到右的最大差价和最小值.即当发现当前值比最小值小的时候更新最小值,否则看一下当前值与之前最小值的差价是否比最大差价大,是 ...
- POJ 3368/RMQ/线段数
题目链接 /* 给出一段序列,询问[L,R]区间内最大相同数的个数. 用一个很巧妙地方法,转化成求区间内的最大值的问题. RMQ维护区间最大值. MAX处理: */ for(int i=1;i< ...
- POJ3264/RMQ
题目链接 /* 询问一段区间内的元素差值最大是多少,用RMQ维护一个最大值和一个最小值,相减即可. */ #include<cstdio> #include<cstring> ...
随机推荐
- 浅谈原生JavaScript的动画和特效
一.JavaScript中的动画原理 动画效果的实现总的来说可分为两种,一种是利用纯css实现,该方法在css3成熟后广泛应用:另外一种是通过JavaScript(或者一些封装的库如jQuery的an ...
- IntelliJ IDEA 创建spring boot 的Hello World 项目
1.Open IDEA,choose "New-->Project" 2.Choose "Spring Initializr" 3. Choose jav ...
- ASE Alpha Sprint - backend scrum 3
本次scrum于2019.11.7再sky garden进行,持续10分钟. 参与人: Zhikai Chen, Jia Ning, Hao Wang 请假: Xin Kang, Lihao Ran, ...
- 10java进阶——IO2
1. Properties类 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. 特点: Hashtable的子 ...
- 五、Ubuntu 16.04 安装PyCharm
方法一,在终端用指令通过第三方源安装pycharm. 本文通过第三方源安装PyCharm,好处是升级方便. 添加源: $ sudo add-apt-repository ppa:mystic-m ...
- 【串线篇】spring boot日志框架
一.日志框架 小张:开发一个大型系统: 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? 2.框架来记录系统的一些运行时信息:日志框架 ...
- springboot--异步执行的方法及定时执行的方法
让方法被调用后异步的执行 一般来说,要异步执行一个任务都是创建一个线程来专门干这个任务.在springboot中有 @Async 这个注解快速实现方法的异步执行.只需要两步:第一步: 在启动类上加上@ ...
- SNOI2017 礼物
题解 设前\(n\)个人的礼物个数和为\(F_n\), 那么显然\[F_n = 2 \times F_{n-1} + i^k\] 考虑矩阵快速幂 棘手的问题是:\(i^k\)不是可以直接用矩阵乘法可以 ...
- 远程连接Linux相关操作
1.远程连接的步骤 编译网卡配置文件,修改onboot参数 vi /etc/sysconfig/network-scripts/ifcfg-ens33进入命令之后将onboot改成onboot=yes ...
- 英语单词composing
composing 来源——书籍Python.Crash.Course.2015.11 Using Individual Values from a List You can use individu ...