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