1. 程式人生 > >【51Nod】1174

【51Nod】1174

基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題  收藏  關注 給出一個有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

總感覺ST演算法像區間dp。

程式碼如下:

#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
int dp[10011][30];
int n;
int num[10011];
void RMQ()
{
	for (int i = 1 ; i <= n ; i++)
		dp[i][0] = num[i];		//初始化獨立的數
	for (int i = 1 ; (1 << i) <= n ; i++)
	{
		for (int j = 1 ; j + (1 << i) - 1 <= n ; j++)
		{
			dp[j][i] = max (dp[j][i-1] , dp[j+(1<<(i-1))][i-1]);
		}
	}
}
int main()
{
	scanf ("%d",&n);
	for (int i = 1 ; i <= n ; i++)
		scanf ("%d",&num[i]);
	RMQ();
	int Q;
	int x,y;
	int l,ans;
	scanf ("%d",&Q);
	while (Q--)
	{
		scanf ("%d %d",&x,&y);
		x++ , y++;		//我是從1開始存數的,所以都加1 
		l = log(y-x+1) / log(2.0);
		ans = max(dp[x][l] , dp[y-(1<<l)+1][l]);
		printf ("%d\n",ans);
	}
	return 0;
}


相關推薦

51Nod1174

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

51Nod1174 區間中最大的數

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

51NOD消滅兔子

ret blog break nbsp pla amp 51nod style turn 【算法】貪心 #include<cstdio> #include<algorithm> #include<cstring> #include&l

51nod1239 歐拉函數之和

歐拉函數 nbsp blog class post var phi 函數 div 【題意】給定n,求Σφ(i),n<=10^10。 【算法】杜教篩 【題解】 $\sum_{i=1}^{n}(\varphi *I)(i)=\sum_{i=1}^{n}\sum_{d|

51nod1238 最小公倍數之和 V3

sum ron 前綴和 body var rac style str 算法 【題意】給定n,求Σi=1~nΣj=1~n lcm(i,j),n<=10^10。 【算法】杜教篩 【題解】 $ans=\sum_{i=1}^{n}\sum_{j=1}^{i}lcm(i,j)$

51nod1222 最小公倍數計數 莫比烏斯反演+組合計數

ace using 復雜度 amp nebula names ons 問題 sin 【題意】給定a和b,求滿足a<=lcm(x,y)<=b && x<y的數對(x,y)個數。a,b<=10^11。 【算法】莫比烏斯反演+組合計數 【題

51nod1822 序列求和 V5

IT 4 sum air clu npr vector AI prime ostream 題解 我是zz吧 nonprime[i * prime[j]] = 0 = = 還以為是要卡常,卡了半天就是過不掉 我們來說這道題…… 首先,我們考慮一個\(K^2\)做法 \(f_{

51nod2026 Gcd and Lcm

truct 處理 main code void freopen cstring pre out 題解 話說LOJ說我今天宜學數論= =看到小迪學了杜教篩去蹭了一波小迪做的題 標解的杜教篩的函數不懂啊,怎麽推的毫無思路= = 所以寫了個復雜度稍微高一點的?? 首先,我們發現f

51nod1227 平均最小公倍數

tdi name source n) ++ RF getc 故事 oid 題解 這個故事告訴們數論函數不要往分式上跑,你推不出來 好久沒推式子了這麽明顯的轉化我都忘了= = 首先\(A(n) = \frac{1}{n} \sum_{i = 1}^{n} \frac{i *

51nod1251 Fox序列的數量

max return -- push_back 代碼量 復雜度 次數 個數 ace 題解 容斥題 我們枚舉出現次數最多的數出現了K次 然後我們需要計算的序列是所有數字出現個數都不超過K - 1次 我們枚舉不合法的數字的數目j,說明這個排列裏除了我們固定出現K次的數至少有j個

51nod1149 Pi的遞推式

names set air Go putc bitset 組合數 == AS 題解 我們把這個函數的遞歸形式畫成一張圖,會發現答案是到每個出度為0的點的路徑的方案數 這個可以用組合數算 記錄一下P[i]為i減幾次PI減到4以內 如果P[i + 1] > P[i],那麽

51nod1164 最高的獎勵 V2

LV out for ace pac define ifdef || std 題解 一道比較神奇的二分圖匹配 既然有n個元素,那麽能匹配n個位置,我們把這n個位置找出來,是每個區間從左端點開始找到一個沒有被匹配到的位置作為該點(我們忽略右端點) 然後我們從價值大到小,然後從

51nod尤拉函式之和(數論,杜教篩)

文章目錄 題目 分析 一個性質 嘗試遞推 分塊 打表 線性篩尤拉函式 一個性質 線性篩 程式碼 題目 12

51nod1779 逆序對統計 狀壓DP

題目傳送門 這題好迷啊,一直都看不懂題目意思……(就不能TMD說的清楚點嗎?) 題目大意:有n個位置和m道題目,第i道題目的權值為i,可以放在第a[i]位上,求最大逆序對數。 看到資料範圍裡n≤2

51nod1008 N的階乘 mod P

題解: 這裡用到了同餘定理 (a+b)%m = (a%m + b%m) % m (a*b)%m = (a%m * b%m) % m  #include <cstdio> using namespace std; long long Solve(i

51NOD 1040-最大公約數之和(尤拉函式)

原題連線 首先補充一個知識點,尤拉函式: 在數論,對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目(φ(1)=1)。此函式以其首名研究者尤拉命名(Euler’s totient function),它又稱為Euler’s totient f

1347 旋轉字串51NOD

基準時間限制:1 秒 空間限制:131072 KB 分值: 5 難度:1級演算法題 S[0...n-1]是一個長度為n的字串,定義旋轉函式Left(S)=S[1…n-1]+S[0]

51nod---1006 最長公共子序列Lcs(動態規劃&&字串LCS)

題目連結這裡呀 1006 最長公共子序列Lcs 基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 收藏 關注 給出兩個字串A B,求A與B的最長公共子序列(子序列不要求是連續的)。 比如兩個串為: abcicba abd

51Nod1043

基準時間限制:1 秒 空間限制:131072 KB 分值: 20 難度:3級演算法題  收藏  關注 1個長度為2N的數,如果左邊N個數的和 = 右邊N個數的和,那麼

51Nod1009

 收藏  關注 給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。 例如:n = 12,包含了5個1。1,10,12共包含3個1,11包含