70pts二次求助
  • 板块P9519 pay
  • 楼主JayMe
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/29 18:53
  • 上次更新2023/11/29 20:59:37
查看原帖
70pts二次求助
1019841
JayMe楼主2023/11/29 18:53

同题第二次问(哭了

4个点TLE了 有没有人可以教教我怎么优化啊!!!

或者是更好的算法...泪目 (还有就是我的快读加上后第二个样例无法输出了于是没用,怎么肥事)

以下是70pst的代码

#include<iostream>
using namespace std;
const int N=1e6+10;
long long n,m;
long long a[N],b[N],c[N];
long long ans=1e18,p; 
inline int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9') { 
        if(c=='-')f=-1; 
        c=getchar(); 
    } 
    while(c>='0'&&c<='9'){ 
        x=x*10+c-'0';
        c=getchar(); 
    } 
    return x*f;
}//快读,不知可否有用..
inline bool jay(long long s){
    for(int i=1;i<=n;i++)c[i]=0;
	for(int i=1;i<=m;i++)
	for(int j=1;j<=n;j++)
		c[j]+=max(min(s-b[i]+j,s+b[i]-j),(long long)0);//这里,简单了
 for(int i=1;i<=n;i++)
	if(c[i]<a[i]) return 0;
	return 1;
}
int main(){
	ios::sync_with_stdio(false); 
	cin.tie();
	cout.tie();
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	long long l=1,r=1e10;
	while(l<=r){
		long long mid=(l+r)/2;
		if(jay(mid)){
			ans=min(ans,mid);
			r=mid-1;
		}else{
			l=mid+1;
		}
	}
	cout<<ans;
	return 0;
}
2023/11/29 18:53
加载中...