原題鏈結
題意給定一段長度為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 ...