二分+RMQ——洛谷 P1419 尋找段落
阿新 • • 發佈:2019-01-29
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表了