二分答案 佇列的運用

2021-08-09 14:38:23 字數 1837 閱讀 4091

序列(sequence)

【題目背景】

在人類智慧型的山巔, 有著一台字長為 1048576 位的超級計算機, 著名理

論計算機科學家 pb 博士正用它進行各種研究。 不幸的是, 這天颱風切斷了電

力系統, 超級計算機無法工作, 而 pb 博士明天就要交實驗結果了, 只好求助

於學過 oi 的你… …

【題目描述】

pb 博士將他的計算任務抽象就是詢問乙個序列的最優值。

具體來說有乙個長度為 n 的序列 a

他想詢問這個序列的子串行的平均數

pb 博士解釋說子串行的平均數為子串行的和除以子串行的長度

pb 博士發現他的計算機似乎出了點問題,只能求長度介 s,t(s<=t)之間的

子串行的平均值的最大值

pb 博士想讓你設計乙個程式幫他求出這個最大值

【輸入格式】

從檔案 sequence.in

中讀入資料。

輸入的第一行 1 個正整數 n;n 的含義見題目描述。

輸入的第二行 2 個正整數 s,t;s,t 的含義見題目描述,資料保證 s<=t

接下來一行 n 個數, 表示序列 a。

同一行輸入的相鄰兩個元素之間, 用恰好乙個空格隔開。

【輸出格式】

輸出到檔案 sequence.out 中。

輸出包括一行表示平均數的最大值, 精確到小數點後 4 位

【樣例輸入】

5 2

3 6 -4 0 1 -3

【樣例輸出】

1.0000

【樣例解釋】

長度為 2 的子串行的平均數的最大值是 1.0000。 即子串行[6,-4]

長度為 3 的子串行的平均數的最大值是 0.6667。 即子串行[6,-4,0]

故答案為 1.0000

【子任務】

資料保證 a[i]∈[-10000,10000]

資料保證序列 a 隨機生成

題目分析

這道題我們可以用暴力來做,直接列舉長度去求最大值,在出題人給的資料中能夠得到55分的高分。當然如果不滿足於此,想多得點分,這樣我們可以想想二分答案,每次二分平均值,然後check一下,check的過程主要是為了判斷以這個數做答案的情況下,是否合法,如果合法,則可以繼續二分更大的值。具體看程式

#include

#include

#include

#include

#include

#define fp(i,a,b) for(register int i=a;i<=b;++i)

using namespace std;

intq[2000005],a[2000005];

long long sum[2000005];

int n,s,t,ans;

//此題跟之前有一道用單調佇列維護的題很像,可以做做那一道

inline int

read()

inline int check(int

x) while(h<=ll&&q[h]

if(h<=ll&&sum[i]-sum[q[h]]>=0) return

1; //關鍵是這裡,如果當前列舉的這個i的字首和減去隊首所存的位置的字首和,如果還是大於0,則說明是合法的。

}return0;}

int main()

printf("%.4lf",(double)ans/100000);}/*

5236 -4

01 -3

*/

二分答案 單調佇列 尋找段落

二分答案 單調佇列字首和維護 每次二分乙個平均值k,序列中的數全部減去k,如果序列中存在長度在 s,t 中且和超過0的子串行,則證明仍然有更大的平均值,到 mid,r 中找,反之,則到 l,mid 中找 這個操作用單調佇列維護 i s q tail 且 sum i s sum q tail 說明i ...

二分查詢與二分答案

主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...

二分查詢和二分答案

1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...