1. 程式人生 > >1174 區間中最大的數 RMQ

1174 區間中最大的數 RMQ

給出一個有N個數的序列,編號0 - N - 1。進行Q次查詢,查詢編號i至j的所有數中,最大的數是多少。 例如: 1 7 6 3 1。i = 1, j = 3,對應的數為7 6 3,最大的數為7。(該問題也被稱為RMQ問題) Input
第1行:1個數N,表示序列的長度。(2 <= N <= 10000)
第2 - N + 1行:每行1個數,對應序列中的元素。(0 <= S[i] <= 10^9)
第N + 2行:1個數Q,表示查詢的數量。(2 <= Q <= 10000)
第N + 3 - N + Q + 2行:每行2個數,對應查詢的起始編號i和結束編號j。(0 <= i <= j <= N - 1)
Output
共Q行,對應每一個查詢區間的最大值。
Input示例
5
1
7
6
3
1
3
0 1
1 3
3 4
Output示例
7
7

3

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[200003],dp[50005][20];
int query(int l,int r);
int main()
{
	int n,i,j,k,m,x,y,s,e;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<=n;i++)
		dp[i][0]=a[i];

	for(j=1;(1<<j)<=n;j++)
	{
		for(i=1;i+(1<<j)-1<=n;i++)
			dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
	}
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&s,&e);
		printf("%d\n",query(s+1,e+1));
	}
	return 0;
}
int query(int l,int r)
{
	int k=0;
	while(1<<(k+1)<=r-l+1)
		k++;
	return max(dp[l][k],dp[r-(1<<k)+1][k]);
}


相關推薦

1174 區間大的數 RMQ

給出一個有N個數的序列,編號0 - N - 1。進行Q次查詢,查詢編號i至j的所有數中,最大的數是多少。 例如: 1 7 6 3 1。i = 1, j = 3,對應的數為7 6 3,最大的數為7

51nod 1174 區間大的數 (線段樹+RMQ

給出一個有N個數的序列,編號0 - N - 1。進行Q次查詢,查詢編號i至j的所有數中,最大的數是多少。 例如: 1 7 6 3 1。i = 1, j = 3,對應的數為7 6 3,最大的數為7。(該問題也被稱為RMQ問題) Input 第1行:1個數N,表

51Nod—1174 區間大的數 線段樹模版

using ace pan struct 註意 truct logs mark mar 在大佬們題解的幫助下算是看懂了線段樹吧。。。在這mark下防一手轉頭就忘。 #include<iostream> #include<stdio.h> using

51Nod 1174 區間大的數

mod == for log inf bits mem ios swap 給出一個有N個數的序列,編號0 - N - 1。進行Q次查詢,查詢編號i至j的所有數中,最大的數是多少。 例如: 1 7 6 3 1。i = 1, j = 3,對應的數為7 6 3,最大的

1174 區間大的數(線段樹)

基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題  收藏  關注 給出一個有N個數的序列,編號0 - N - 1。進行Q次查詢,查詢編號i至j的

1174 . 區間大的數

1174 . 區間中最大的數 時間限制:1 秒 空間限制:65536 KB 分值: 0 給出一個有N個數的序列,編號0 - N - 1。進行Q次查詢,查詢編號i至j的所有數中,最大的數是多少。 例如: 1 7 6 3 1。i = 1, j = 3,對應的數為7 6 3

【51Nod】1174 區間大的數

題意 給出一個有N個數的序列,編號0 - N - 1。進行Q次查詢,查詢編號i至j的所有數中,最大的數是多少。 例如: 1 7 6 3 1。i = 1, j = 3,對應的數為7 6 3,最大的數為

51nod1174 區間大的數

/* 1,線段樹查詢區間最值 2,RMQ */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; c

iOS求陣列元素大數小數以及求和、求平均值

直接上貨 NSArray *testArray = [NSArray arrayWithObjects:@”2.0”, @”2.3”, @”3.0”, @”4.0”, nil]; NSNumber *sum = [testArray valueForKeyPath:@”@sum.floa

51Nod 1062 序列大數 打表

有這樣一個序列a: a[0] = 0 a[1] = 1 a[2i] = a[i] a[2i+1] = a[i] + a[i+1] 輸入一個數N,求a[0] - a[n]中最大的數。 a[0] = 0, a[1] = 1, a[2] = 1, a[3] = 2,

Scala List 操作 list大數的下標 Vector轉List

1.List操作 take takeRight takeWhile val nums = List(1,1,1,1,4,4,4,4) val left = nums.take(4) //List(1,1,1,1) val right =

51NOD1174 區間大數 && RMQ問題(ST算法)

pac cst %d for ron 介紹 nlog double sin RMQ問題(區間最值問題Range Minimum/Maximum Query)     ST算法     RMQ(Range Minimum/Maximum Query),即區間最值查

POJ 3368 Frequent values(RMQ區間出現多次數的數字的次數)

popu man most add scrip algo main for you 題目鏈接:http://poj.org/problem?id=3368 Description You are given a sequence of n int

RMQ——蒜頭君的玩具娃娃(區間範圍大值-區間範圍小值)

mes default bsp lose 格式 baseline 自己的 con using 蒜頭君有 N 個玩具娃娃,編號依次從 1 到 N,每個娃娃都有自己的高度值。蒜頭君想考考聰明的你,蒜頭君會有 Q 次詢問,每次詢問給定兩個整數 A 和 B,求問編號 A 和編號

UVa 11235 Frequent values (RMQ && 區間出現多次的數的次數)

升序 req display 最大 這一 屬於 分析 size 原來 題意 : 給出一個長度為 n 的不降序序列,並且給出 q 個形如(L, R)的問詢,問你這個區間出現的最多次的數的次數。 分析 : 很自然的想到將區間“縮小”,例如1 1 2 3 3 3就可以變成2

返回數組大數 -freeCodeCamp

pan () nbsp out lar 當前 [] sort 應該 找出多個數組中的最大數 右邊大數組中包含了4個小數組,分別找到每個小數組中的最大值,然後把它們串聯起來,形成一個新數組。 給出的數組如下:      largestOfFour([[4, 5, 1, 3

MapReuce大數據處理合適的數據格式是什麽?

reduce 版本支持 詳細 復雜 設置 解壓縮 表示 字符串 保存 本節作為《Hadoop從入門到精通》大型專題的第三章第二節將教大家如何在Mapreduce中使用XML和JSON兩大常見格式,並分析比較最適合Mapreduce大數據處理的數據格式。 在本章的第一章節介紹

FJUT3568 二病也要敲程式碼(線段樹維護區間連續值)題解

題意:有一個環,有1~N編號,m次操作,將a位置的值改為b,問你這個環當前最小連續和多少(不能全取也不能不取) 思路:用線段樹維護一個區間最值連續和。我們設出兩個變數Lmin,Rmin,Mmin表示區間左邊最小連續和,右邊最小連續和,區間最小連續和,顯然這可以通過這個方式更新維護。 現在我們已經可以維

求任意一個區間大值,小值 - 單調棧

連結:https://ac.nowcoder.com/acm/contest/223/C來源:牛客網 題目描述 給出長度為n的序列a,其中第i個元素為 ,定義區間(l,r)的價值為 請你計算出

快速找出一個數組大數、第二大數

#include <stdio.h> int main() {         int a[] = {12, 159, 8, 1, 165, 122, 56, 99, 165};     int