二分答案+單調佇列字首和維護
每次二分乙個平均值k, 序列中的數全部減去k,如果序列中存在長度在[s, t]中且和超過0的子串行, 則證明仍然有更大的平均值, 到[mid, r]中找, 反之, 則到[l, mid] 中找 (這個操作用單調佇列維護)
i - s > q[tail] 且 sum[i - s] < sum[q[tail]] 說明i-s這個點更不容易超出[s, t] 的範圍, 且構成的子串行和更大, 所以生存能力更強orzorz
詳見**qwq
1 #include2 #include3#define sz 100010
4#define dou double
5using
namespace
std;
6int
n, s, t;
7int
q[sz], b[sz];
8 dou l, r, mid, ans = 0;9
dou a[sz], sum[sz];
10bool
check(dou x)
21if(head <= tail && q[head] < i - t) head++;
22if(head <= tail && sum[i] - sum[q[head]] >= 0) return
true
; 23}24
return
false;25
}26intmain()
37else r = mid - 1e-5;38
}39 printf("
%.3lf\n
", ans);
40return0;
41 }
尋找段落(二分 單調佇列)
題目描述 給定乙個長度為n的序列a i,定義a i 為第i個元素的價值。現在需要找出序列中最有價值的 段落 段落的定義是長度在 s,t 之間的連續序列。最有價值段落是指平均值最大的段落,段落的平均值 段落總價值 段落長度。輸入輸出格式 輸入格式 第一行乙個整數n,表示序列長度。第二行兩個整數s和t,...
P1419 尋找段落 二分答案 單調佇列
好久沒寫題了,拼死拼活才寫了道綠題。題目中要我們求一段數列的平均值,這段數的長度被限定在s t之間。那麼我們可以用二分法列舉答案,之後來尋找區間,如果這些區間之中有乙個區間中的數減去二分出的答案的和要比二分出的答案要大,則說明這個二分答案比我們要求的真正的答案要小,則改變區間重新列舉。如果沒有任何乙...
P1419 尋找段落 單調佇列 二分
題意 給出n個數,讓我們求出乙個最大的平均值 求平均值的區間只能在 s,t 這樣的乙個範圍內選取 假如 3 4 則表明可以選擇乙個區間大小為3或者4的,而不能選擇其他大小 思路 首先二分答案,即 二分最大平均值。我們將a全部減去mid,問題轉化為判斷是否存在乙個長度在s t範圍內的區間它的和為正,如...