歷屆試題 區間k大數查詢(優化演算法)

2021-08-16 06:36:39 字數 1233 閱讀 2413

問題描述

給定乙個序列,每次詢問序列中第l個數到第r個數中第k大的數是哪個。

輸入格式

第一行包含乙個數n,表示序列長度。

第二行包含n個正整數,表示給定的序列。

第三個包含乙個正整數m,表示詢問個數。

接下來m行,每行三個數l,r,k,表示詢問序列從左往右第l個數到第r個數中,從大往小第k大的數是哪個。序列元素從1開始標號。

輸出格式

總共輸出m行,每行乙個數,表示詢問的答案。

樣例輸入

51 2 3 4 5

21 5 2

2 3 2

樣例輸出42

資料規模與約定

對於30%的資料,n,m<=100;

對於100%的資料,n,m<=1000;

保證k<=(r-l+1),序列中的數<=106。

解題思路:

此題有一種暴力解決方法是每定乙個區間的第x大時,就把區間內的值取出排序,取第x大的數,但很明顯,當n,m足夠大,暴力就顯得很浪費時間。

所以採取一開始對n個數進行排序,排序時輸入順序也要對應記錄下。然後以下面的例子說明,倘若輸入9個數:

然後進行一次排序

隨後我們輸入區間和取得第x大,假如是第2個輸入到第8個輸入(即是上圖輸入順序的1到7),第4大的話,我們可以從上圖的輸入順序,由下往上進行判斷是否滿足輸入區間,是則計一,不是則過,計到等於x時,對應的值即為第x大。

以此方法可適應大量資料,只需要做一次排序,不需要重複排序,對於大量資料,時間複雜度會明顯降低。

#include"stdio.h"

long def(long i[2][1000],int l,int r,int num,int k);

int main()

return 1;

}

試題 演算法訓練 區間k大數查詢

試題 演算法訓練 區間k大數查詢 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個序列,每次詢問序列中第l個數到第r個數中第k大的數是哪個。輸入格式 第一行包含乙個數n,表示序列長度。第二行包含n個正整數,表示給定的序列。第三個包含乙個正整數m,表示詢問個數。接下來m行,...

試題 歷屆試題 k倍區間

試題 歷屆試題 k倍區間 資源限制 時間限制 2.0s 記憶體限制 256.0mb 問題描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入格式 第一行包...

歷屆試題 k倍區間

問題描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入格式 第一行包含兩個整數n和k。1 n,k 100000 以下n行每行包含乙個整數ai。1 ai ...