蒟蒻求助,不明白单调队列,恳请诸位帮忙讲讲(;´༎ຶД༎ຶ`),非常感谢!!!
查看原帖
蒟蒻求助,不明白单调队列,恳请诸位帮忙讲讲(;´༎ຶД༎ຶ`),非常感谢!!!
257348
theHermit楼主2020/8/30 19:06

请问为啥单调队列内为啥不能先做判断然后h++呢?..

while(h<=t&&Q[h]+r<i) h++;

这样会WA8个点..

#include<bits/stdc++.h>
#define For(i,m,n) for(register int i=m;i<n;i++)
#define r(a) read(a)
#define rr(a,b) read(a),read(b)
using namespace std;
template <class T>
inline void read(T &x)
{
	x=0;
    T f=1;
    char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	x=x*f;
}
const int MAX=2e6+4;
int n;
int l,r;
int a[MAX];
double sum[MAX];
int Q[MAX];
void input()
{
    r(n);
    rr(l,r);
    For(i,1,n+1){
        r(a[i]);
    }
}

bool judge(double mid)
{
    memset(Q,0,sizeof(Q));
    For(i,1,n+1)    sum[i]=sum[i-1]+(double)a[i]-mid;
    int h=1,t=0;
    For(i,l,n+1){
        while(h<=t&&Q[h]+r<i)  h++;
        while(h<=t&&sum[Q[t]]>=sum[i-l]) t--;
        Q[++t]=i-l;
        
        if(h<=t&&sum[i]-sum[Q[h]]>=0) return true;
    }
    return false;
}

int main()
{
    input();
    double lo=-10000,hi=10000;
    while(hi-lo>=1e-5){
        double mid=(lo+hi)/2;
        if(judge(mid))  lo=mid;
        else            hi=mid;
    }
    printf("%.3lf",lo);
    return 0;
}

2020/8/30 19:06
加载中...