二分40pts求助
查看原帖
二分40pts求助
772478
Wisdom_chicken_god楼主2023/8/14 15:57
#include<bits/stdc++.h>
using namespace std;
long long a[1000001],n,m,b[1000001],maxx=-1,minx=1000000001,c[1000001],r=0;
inline int read(){
     int x=0,f=1;
     char ch=getchar();
     while(ch<'0'||ch>'9'){
         if(ch=='-')
             f=-1;
         ch=getchar();
     }
     while(ch>='0'&&ch<='9'){
         x=(x<<1)+(x<<3)+(ch^48);
         ch=getchar();
     }
     return x*f;
}
inline void write(int x)
 {
 	 if(!x) putchar('0');
     char F[200];
     int tmp=x>0?x:-x ;
     if(x<0)putchar('-') ;
     int cnt=0 ;
        while(tmp>0)
        {
            F[cnt++]=tmp%10+'0';
            tmp/=10;
        }
        while(cnt>0)putchar(F[--cnt]) ;
}


int check(int x)
{
	memset(c,0,sizeof(c));
	for(long long i=1;i<=m;i++)
	{
		long long y=b[i];
		c[y]+=x;
		for(long long j=1;j<=n;j++)
		{
			c[j]+=max(r,x-abs(j-y));
		}
	}
	for(long long i=1;i<=n;i++)
	{
		if(c[i]<a[i])
		return 0;
	}
	return 1;
}
int main(){
	n=read();
	m=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		minx=min(minx,a[i]);
		maxx=max(maxx,a[i]);
	}
	for(int i=1;i<=m;i++)
	{
		b[i]=read();
	}
	int l=minx,r=maxx;
	/*for(int i=minx;i<=maxx;i++)
	{
		if(check(i)==1){
			write(i);
			return 0;
		}
		
	}*/
	int mid;
	while(l<r-1)
	{
		mid=l+(r-l)/2;
		if(check(mid)==1)
		{
			for(int i=1;i<=n;i++)
			{
				if(c[i]>a[i])
				{
					r=mid;
				}
			}
			
		}
		if(check(mid)==0)
		{
			l=mid;
		}
	}
	write(r);
	return 0;
}
2023/8/14 15:57
加载中...