codevs 2021 中庸之道

2021-08-03 14:06:57 字數 1199 閱讀 3342

題目描述 description

給定乙個長度為n的序列,有q次詢問,每次詢問區間[l,r]的中位數。

資料保證序列中任意兩個數不相同,且詢問的所有區間長度為奇數。

輸入描述 input description

第一行為n,q。

第二行n個數表示序列。

接下來q行,每行為l,r,表示一次詢問。

輸出描述 output description

輸出q行,對應每次詢問的中位數。

本題是一道非常考驗思維能力的題,**強度也比較大,所以這裡第一行要膜艾神。

如果我們能開兩種東西,乙個存的比另乙個多乙個,而且乙個裡面最小的比另乙個裡面最大的都要大,那麼中位數便是當全是大的裡面比全是小的裡面多乙個時,最大的裡面最小的,或者是全是小的比全是大的多乙個時,全是小的裡面最大的。

那麼有沒有這種能夠快速查詢最大或最小的乙個呢,那麼就是優先佇列了。

我們可以先開兩個優先佇列 cunda(存都是大的,要取最小的),cunxiao(存都是小的,要取最大的),乙個cnt記住當時的步驟。當cnt為偶數時,我們需要將兩個佇列的數量變為相等,即把多的佇列裡的隊首元素pop出來,存到少的那乙個,因為可能會出現乙個比另乙個多兩個的情況。接著當cnt為奇數時,將元素存進佇列後,即可以判斷多的那乙個裡面的隊首,便是這些數裡面的中位數了。

對於每乙個可能的l,從l開始向右列舉r到n,存下中位數。共有n的平方種可能,再加上優先佇列的查詢複雜度logn,約為n方logn的複雜度,最後對於每乙個詢問o(1)查詢,ac。

下附ac**。

#include#include#define maxn 1005

using namespace std;

priority_queue,greater>cunda[maxn];

priority_queuecunxiao[maxn];

long long n,q;

long long a[maxn];

long long mid[maxn][maxn];

void f(long long now)

} if(cnt%2==1)

}}int main()

for(long long i=1;i<=n;i++)

f(i);

for(long long i=1;i<=q;i++)

{ long long a,b;

cin>>a>>b;

cout<

中庸之道(codevs 2021)

題目描述 description 給定乙個長度為n的序列,有q次詢問,每次詢問區間 l,r 的中位數。資料保證序列中任意兩個數不相同,且詢問的所有區間長度為奇數。輸入描述 input description 第一行為n,q。第二行n個數表示序列。接下來q行,每行為l,r,表示一次詢問。輸出描述 ou...

codevs 2021 中庸之道

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解檢視執行結果 給定乙個長度為n的序列,有q次詢問,每次詢問區間 l,r 的中位數。資料保證序列中任意兩個數不相同,且詢問的所有區間長度為奇數。輸入描述 input description 第一行為n,q。第二行n個數...

中望結構2021

中望結構2021是一款非常專業,且基於中望cad製作出來的結構設計繪圖外掛程式,不但擁有非常人性化的作業系統和整潔的介面,而且還為使用者提供了智慧型便捷的結構查詢 結構符號 尺寸文字 鋼砼計算 直線軸網 格內文字 砌體結構 繪製圖框 繪製幾何圖形 雙線牆 抽網建牆等諸多簡易的繪圖功能,以此來幫助你大...