1. 程式人生 > >二分+RMQ——洛谷 P1419 尋找段落

二分+RMQ——洛谷 P1419 尋找段落

https://www.luogu.org/problem/show?pid=1419
我們直接二分答案;
然後只要驗證是否有區間滿足平均值>mid就好了;
這有一個簡單的方法,就是把a[]每個數勸減去mid;
然後判斷有沒有一段的和>0;
這個用RMQ就好了;

#include<bits/stdc++.h>
#define Ll long long
using namespace std;
const Ll N=1e5+5;
Ll a[N],sum,f[N];
double s[N];
int n,x,y;
bool check(double k){
    for(Ll i=1
;i<=n;i++)s[i]=a[i]-k+s[i-1]; Ll l=1,r=1;f[1]=0; for(Ll i=x;i<=n;i++){ while(r>=l&&i-f[l]>y)l++; if(s[i]>=s[f[l]])return 1; while(r>=l&&s[i-x+1]<s[f[r]])r--; f[++r]=i-x+1; } return 0; } int main() { scanf("%d%d%d"
,&n,&x,&y); for(Ll i=1;i<=n;i++)scanf("%lld",&a[i]),sum+=a[i]; double l=0,r=sum; while(r-l>1e-6){ double mid=(l+r)/2.0; if(check(mid))l=mid;else r=mid; } printf("%.3lf",l); }

話說我好像好久沒有寫st表了