爆零了,求助,样例过了
  • 板块P9519 pay
  • 楼主SUPERZGY
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/13 18:02
  • 上次更新2023/11/3 04:03:36
查看原帖
爆零了,求助,样例过了
344644
SUPERZGY楼主2023/8/13 18:02

查询时标记点,爆了

#include<iostream>
#include<cmath>
using namespace std;
long long n,m,a[1000005],p[1000005],b[1000005],f1[1000005],f2[1000005],fl,fr;
int pd(int mid){
	for (int i=1;i<=n;i++){
		f1[i]=0;
		f2[i]=0;
		p[b[i]]=1;
	}
	fl=0;fr=0;
	for (int i=1;i<=m;i++){
		if(b[i]-mid+1>=1) f1[b[i]-mid+1]+=1;
		else {
			fl+=2-(b[i]-mid+1);
			f1[1]++;
		}
		if(b[i]+mid-1<=n) f2[b[i]+mid-1]=-1;
		p[b[i]]=1;
	}
	long long cnt1=0,cnt2=0,sum=0;
	for (int i=1;i<=n;i++){
		if(f1[i]>=1) cnt1+=f1[i];
		if(f2[i]<=-1) cnt2--;
		if(i==1) sum+=fl;
		sum+=cnt1;
		sum-=cnt2;if(sum<a[i]) return -1;
		if(p[i]==1){
			cnt2++;
			cnt1--;
		}
		
	}
	return 1;
}
int main(){
	cin>>n>>m;
	for (int i=1;i<=n;i++)
	cin>>a[i];
	for (int i=1;i<=m;i++){
		cin>>b[i];
	}
	int ans=0;
		long long l=1,r=1000000000+n,mid=(l+r)/2;
		while(l<=r){
			int k=pd(mid);
			if(k==-1) l=mid+1; 
			if(k==1) {
				ans=mid;
				r=mid-1;
			}
			mid=(r+l)/2;
		}
		cout<<ans;
	return 0;
}
2023/8/13 18:02
加载中...