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> ...
随机推荐
- 定制团队自己的 Vue template
一,我们使用vue-cli 可以快速初始化vue.js的项目,官方提供了webpack,pwa,browserify-sipmple,等常用template 二.置知识1,模板结构template:该 ...
- 2018-11-19-visualStudio-无法登陆
title author date CreateTime categories visualStudio 无法登陆 lindexi 2018-11-19 15:24:15 +0800 2018-2-1 ...
- 一、ARM
1.1 ARM 分类 1.1.1 版本号分类 以前分类的是 ARM7,ARM9... ARM11,在 ARM11 之后,就是以 Cortex 系列分类了: Cortex-R:应用在实时系统上的系列 C ...
- struts2+ajax 前后端传值
摘要: 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的数据,并转换为json类型模式数据 3.配置struts.xml文件 4.页面脚本接受并处理数 ...
- 对webpack的初步研究8
模块 编辑文档 在模块化编程中,开发人员将程序分解为称为模块的离散功能块. 每个模块的表面积小于完整程序,使验证,调试和测试变得微不足道.编写良好的模块提供了可靠的抽象和封装边界,因此每个模块在整个应 ...
- dict以及defaultdict的简单使用
先看一个需求 from collections import defaultdict """ 需求: 统计user_list中字母出现的次数 ""&q ...
- bzoj1964: hull 三维凸包
传送门 二维平面四个点求凸包面积->任选三个点面积之和/2 三维平面五个点求凸包体积->任选四个点体积之和/2 二维平面三个点面积->二个二维向量行列式值的绝对值/2 三维平面四个点 ...
- php strtotime,mktime,DateTime函数处理时间累加问题
时间戳(年月日时分秒) 使用strtotime函数,结合+1 month,-1 month,next month,last month的时候会出现一些问题. demo示例: //时间"20 ...
- jQuery FileUpload doesn't trigger 'done'
https://stackoverflow.com/questions/14674999/jquery-fileupload-doesnt-trigger-done If your server ...
- jmeter常用组件简介
本文主要介绍jmeter使用过程中最常用的一些组件及其作用.性能测试时线程组中可以添加如下的组件,如图所示: test plan:测试计划,是其它组件的容器 thread:线程组,用来设置多少线程,怎 ...