洛谷1419 尋找段落(單調佇列)

2021-07-10 20:54:12 字數 1614 閱讀 4448

洛谷1419 尋找段落

題目描述

給定乙個長度為n的序列a_i,定義a[i]為第i個元素的價值。現在需要找出序列中最有價值的「段落」。段落的定義是長度在[s,t]之間的連續序列。最有價值段落是指平均值最大的段落,

段落的平均值=段落總價值/段落長度。

輸入輸出格式

輸入格式:

第一行乙個整數n,表示序列長度。

第二行兩個整數s和t,表示段落長度的範圍,在[s,t]之間。

第三行到第n+2行,每行乙個整數表示每個元素的價值指數。

輸出格式:

乙個實數,保留3位小數,表示最優段落的平均值。

輸入輸出樣例

輸入樣例#1:

32 23-1

2輸出樣例#1:

1.000

說明【資料範圍】

對於30%的資料有n<=1000。

對於100%的資料有n<=100000,1<=s<=t<=n,-10000<=價值指數<=10000。

【題目**】

tinylic改編

【思路】

二分+單調佇列。

首先二分最大平均值x。

那麼問題就轉化為:是否存在乙個區間的的平均值大於x。這個問題可以模擬於uva11090 going in cycle!!,我們將a全部減去x,問題進一步轉化為判斷是否存在乙個長度在s..t範圍內的區間它的和為正,如果有說明還有更大的平均值。

如何判斷?單調佇列。

令sum表示a-x的字首和。則上述條件可以變化為sumi-sumj>=0,對於i我們需要找到指定區間內的最大sumj。

單調佇列維護序號在i-t到i-s的區間,保持sum的遞增序,求區間最大值,判斷與0的關係即可。

【**】

1 #include2 #include3 #include4

using

namespace

std;56

const

int maxn = 100000+10;7

8int

a[maxn];

9int

n,s,t;

1011

double

sum[maxn];

12int

q[maxn],front,rear;

13bool can(double

x) 22

if (front <= rear && q[front] < i - t) front++; //

維護區間i-t

23if (front <= rear && sum[i] - sum[q[front]] >= 0) return

true; //

有大於0的區間和說明最大平均值還可以更大 24}

25return

false;26

}2728int

main()

37 printf("

%.3lf\n

",l);

38return0;

39 }

Luogu P1419尋找段落(單調佇列)

題目鏈結 不知為何狀態突然奇差無比,按說這題本來應該是水題的,但不僅不會做,還比著題解爆零五次 二分平均值 想到了 單調佇列維護最大區間和 想到了但是不會,為什麼我不會?include include include include include define maxn 200020 define...

洛谷 P1419 尋找段落(單調佇列,二分

p1419 尋找段落 題意 在n個元素中找l size r的最大連續段落平均值。思路1 先求字首和,雙重迴圈暴力找最大平均值。如下 include include include include include include include include include include incl...

P1419 尋找段落 單調佇列 二分

題意 給出n個數,讓我們求出乙個最大的平均值 求平均值的區間只能在 s,t 這樣的乙個範圍內選取 假如 3 4 則表明可以選擇乙個區間大小為3或者4的,而不能選擇其他大小 思路 首先二分答案,即 二分最大平均值。我們將a全部減去mid,問題轉化為判斷是否存在乙個長度在s t範圍內的區間它的和為正,如...