Luogu1419 區間問題 二分 單調優化

2022-06-05 07:54:09 字數 1062 閱讀 5901

原題鏈結

題意給定一段長度為1e5的序列a,並且給我們乙個範圍 \([s, t]\), 要求我們求出一段長度在這個範圍內的連續子串行,並且要使這個連續子串行的平均值最大,輸出這個平均值。

思路一開始想的是連續子段和相關,於是好久都沒有想到正解。

\[a[l...r] / (r - l + 1) \ge k

\]\[a[l...r] \ge k * (r - l + 1)

\]\[a[l...r] - k * (r - l + 1) \ge 0

\]ac**

#include #include #include #include using namespace std;

const double ff = 1e-4;

double su[100005];

int n, s, t, m;

struct ab

que[100005];

bool chk(double k)

su[0] = 0;

bool fl = false;

int hd = 1, tl = 1;

for (int i = 0; i < m; ++i)

que[tl].l = i;

que[tl++].v = su[i];

if (su[i + s] - que[hd].v >= 0)

}if (!fl)

while (tl > hd && que[tl - 1].v >= su[i])

que[tl].l = i;

que[tl++].v = su[i];

if (su[i + s] - que[hd].v >= 0)

} }

for (int i = 1; i <= n; ++i)

return fl;

}int main()

while (ll + ff * 5 <= rr)

else

}while (chk(ll))

printf("%.3f", ll - ff);

return 0;

}

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

傳送門 題意 求最大段落平均值 子段和除以長度 段落長度在s到t之間 題解 段落平均值一定在某個區間 min,v 內取值 雖然取值是離散的但是有界 v即為所求最大平均值。考慮二分答案,當前二分的答案為mid,如果將所有數都減去mid後仍存在乙個長度在s到t之間的子段和非負,那該段落的平均值一定不小於...

二分查詢 二分區間 快速冪(二分冪)

include include using namespace std 二分查詢 初始區間 0,n 1 intbinarysearch int a,int left,int right,int x else return 1 二分 找出元素的區間左閉右開 初始區間 0,n intlower boun...

考前看 57 插入區間 二分 區間合併

解題思路 利用二分法找到合適的位置插入區間 1.列舉特殊情況 插入最左端和插入最右端 2.找到第乙個區間,使得區間的右端點大於目標區間的左端點 3.找到第二個區間,使得區間的右端點大於目標區間的右端點 4.處理一種特殊情況,就是這個區間單獨成為區間段,不與其他區間合併 class solution ...