请问为啥单调队列内为啥不能先做判断然后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;
}