Luogu 1419(二分答案 單調佇列)

2021-10-04 01:27:38 字數 861 閱讀 7399

傳送門

題意:求最大段落平均值(子段和除以長度),段落長度在s到t之間

題解:段落平均值一定在某個區間[min,v]內取值(雖然取值是離散的但是有界),v即為所求最大平均值。考慮二分答案,當前二分的答案為mid,如果將所有數都減去mid後仍存在乙個長度在s到t之間的子段和非負,那該段落的平均值一定不小於mid。滿足所有數都減去mid後仍存在乙個長度符合要求的子段和非負的前提下,不斷將mid最大化,最終的mid就是所求最大段落平均值。

至於如何判斷存在乙個長度在s到t之間的子段和非負,先求一次字首和sum,然後對於每個i維護[i-t,i-s]區間內sum的最小值s,如果維sum[i]-s非負那一定存在乙個長度在s到t之間的,以i結尾的子段和非負,否則一定不存在滿足條件的以i結尾的子段。既然[i-t,i-s]區間長度固定,使用「滑動視窗」模型,用單調佇列維護[i-t,i-s]區間內sum的最小值,複雜度為線性。

總複雜度為o(n(logs)),s為mid的取值範圍長度,約為20。

#include#include#include#includeusing namespace std;

const int n=1e5+4;

const double eps=1e-4;

int n;

int s,t;

double a[n],sum[n];

int q[n];

inline void init(double x)

inline bool ok(double delta)

return false;

}int main()

printf("%.3lf\n",l);

return 0;

}

Luogu1419 區間問題 二分 單調優化

原題鏈結 題意給定一段長度為1e5的序列a,並且給我們乙個範圍 s,t 要求我們求出一段長度在這個範圍內的連續子串行,並且要使這個連續子串行的平均值最大,輸出這個平均值。思路一開始想的是連續子段和相關,於是好久都沒有想到正解。a l.r r l 1 ge k a l.r ge k r l 1 a l...

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

好久沒寫題了,拼死拼活才寫了道綠題。題目中要我們求一段數列的平均值,這段數的長度被限定在s t之間。那麼我們可以用二分法列舉答案,之後來尋找區間,如果這些區間之中有乙個區間中的數減去二分出的答案的和要比二分出的答案要大,則說明這個二分答案比我們要求的真正的答案要小,則改變區間重新列舉。如果沒有任何乙...

二分(二分答案 二分搜尋)與單調性

經典二分搜尋是二分空間範圍。二分答案又叫二分猜值,是二分解的值空間。其實可以統一,普通的二分搜尋也是二分答案值域 下標空間,也是猜值。二分必須滿足單調性,最直觀的,二分搜尋只能在有序陣列上進行。單調性體現在,下標和元素值是單調的,也就是 if j i 有 a j a i 一般二分答案解決的問題是最優...