時間限制: 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大的數是哪個。序...