萌新求助
查看原帖
萌新求助
521411
SimonLJK楼主2023/7/4 22:36

莫名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;
} 

问题应该是在二分那里,有没有大佬帮忙看看?

2023/7/4 22:36
加载中...