雜題 區間第K大 kth

2021-08-06 02:28:57 字數 1171 閱讀 1187

時間限制: 20 sec  記憶體限制: 256 mb

提交: 48  解決: 37

[提交][狀態][討論版]

想必大家對區間第k大問題相當熟悉了。這個問題是這樣的,給一串串行和若干詢問,每個詢問查詢某段連續區間中第k大的數。現在我們考慮乙個該問題的「reverse」版本。現在我們給出序列和q個詢問,每個詢問給出k_i和x_i,詢問有多少區間其第k_i大的數為x_i。

第一行乙個整數n和q,表示序列長度和詢問個數。

第二行n個整數a_i,表示序列中的元素。

接下來q行,每行兩個整數k_i和x_i,表示詢問。

一共q行,每行表示對應詢問的答案。

3 21 1 21 12 1
33
對於20%的資料,n<=100

對於40%的資料,n<=500

對於100%的資料,n<=2000,q<=2000000, 1 ≤ k_i ≤ n,1 ≤ x_i ≤ n

正解是n^2預處理每個點。shu[i]表示到第i位時,有多少個數比當前列舉的點大。sum1[i]記錄這個點之前包含i個比他大的點的區間數。sum2[i]就是後面的。

f[a[i]][k+j+1]+=sum1[j]*sum2[k],這個就很好解釋了,a[i]為第k+j+1大時就是他前面有j個比他大的區間數*後面有k個比他大的區間數。。。

注意細節,因為重複出現的值不去重,所以。。前後中有乙個判斷是不帶=的,這樣才能對上。

sum1[0]=sum2[0]=1,包含他自己。

#include#include#include#include#includeusing namespace std;

int read()

while(x>='0'&&x<='9')

return sum*f;

}int n,q,a[2005],f[2005][2005],shu[2005],num1[2005],num2[2005];

int main()

for(int j=i+1;j<=n;j++)

num2[0]++;num1[0]++;

for(int j=0;j<=shu[1];j++)

for(int k=0;k<=shu[n];k++)

f[a[i]][k+j+1]+=num2[k]*num1[j];

// for(int j=0;j<=n;j++)cout<

雜題 區間第K大 kth

時間限制 20 sec 記憶體限制 256 mb 提交 48 解決 37 提交 狀態 討論版 想必大家對區間第k大問題相當熟悉了。這個問題是這樣的,給一串串行和若干詢問,每個詢問查詢某段連續區間中第k大的數。現在我們考慮乙個該問題的 reverse 版本。現在我們給出序列和q個詢問,每個詢問給出k ...

靜態區間 kth 第 k 小數

給定乙個長度為 n 的整數序列,下標為 1 sim n m 個操作,每次給定 l,r,k 表示詢問下標為 l sim r 的區間內第 k 小的數 1 leq n leq 10 1 leq m leq 10 a leq 10 值域很大,建立權值線段樹,權值線段樹要求離散化後的值之間的大小關係不發生改變...

區間第k大

問題描述 給定乙個序列,每次詢問序列中第l個數到第r個數中第k大的數是哪個。輸入格式 第一行包含乙個數n,表示序列長度。第二行包含n個正整數,表示給定的序列。第三個包含乙個正整數m,表示詢問個數。接下來m行,每行三個數l,r,k,表示詢問序列從左往右第l個數到第r個數中,從大往小第k大的數是哪個。序...