莫名RE
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
const int N=5e5+9;
const double eps=1e-8;
struct node{
ll pos,num;
//从num开始解为pos
};
ll n,a[N],dpb[N],dpf[N];
ll solve(ll l,ll r){
if(sqrt(r)-sqrt(l)>=a[l]-a[r])
return 0;
if((r-l)<=(a[l]-a[r])*(a[l]-a[r]))
return -1;
ll left=1,right=l,mid,ans;
ld dif;
while(left<=right){
mid=(left+right)/2;
dif=sqrt(r-mid)-sqrt(l-mid);
if(dif>=a[l]-a[r]){
right=mid-1;
ans=mid;
}
else
left=mid+1;
}
return ans;
}
void dob(){
ll pos=0;ld val=0,mx=0;
for(int i=1;i<=n;i++){
val=a[i]+sqrt(abs(i-1));
if(val>mx||abs(val-mx)<=eps){
mx=val;
pos=i;
}
}
dpb[1]=pos;
ll l=pos,r=pos+1,s;
queue<node> q;
q.push((node){pos,1});
node now;
while(r<=n){
now=q.front();
l=now.pos;
s=solve(l,r);
while(s<=now.pos&&s!=-1){
q.pop();
now=q.front();
l=now.pos;
s=solve(l,r);
}
if(s!=-1){
dpb[s]=r;
q.push((node){r,s});
}
r++;
}
for(int i=1;i<=n;i++)
dpb[i]=max(dpb[i],dpb[i-1]);
return;
}
void dof(){
for(int i=1;i<=n/2;i++)
swap(a[i],a[n-i+1]);
ll pos=0;ld val=0,mx=0;
for(int i=1;i<=n;i++){
val=a[i]+sqrt(abs(i-1));
if(val>mx||abs(val-mx)<=eps){
mx=val;
pos=i;
}
}
dpf[1]=pos;
ll l=pos,r=pos+1,s;
queue<node> q;
q.push((node){pos,1});
node now;
while(r<=n){
now=q.front();
l=now.pos;
s=solve(l,r);
while(s<=now.pos&&s!=-1){
q.pop();
now=q.front();
l=now.pos;
s=solve(l,r);
}
if(s!=-1){
dpf[s]=r;
q.push((node){r,s});
}
r++;
}
for(int i=1;i<=n;i++)
dpf[i]=max(dpf[i],dpf[i-1]);
for(int i=1;i<=n;i++)
dpf[i]=n+1-dpf[i];
for(int i=1;i<=n/2;i++){
swap(dpf[i],dpf[n-i+1]);
swap(a[i],a[n-i+1]);
}
return;
}
int main(){
freopen("xldh.in","r",stdin);
freopen("zj.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
dob();
dof();
ll b,f,v1,v2,p;
for(int i=1;i<=n;i++){
b=dpb[i];f=dpf[i];
v1=a[b]+ceil(sqrt(b-i));v2=a[f]+ceil(sqrt(i-f));
p=max(v1,v2)-a[i];
printf("%lld\n",p);
}
return 0;
}
问题应该是在二分那里,有没有大佬帮忙看看?