問題描述
給定乙個序列,每次詢問序列中第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 ...