求修改输入(玄关)
查看原帖
求修改输入(玄关)
661096
asas111楼主2024/3/20 21:22

这个代码是我从其他 OJ 上复制过来的,那题输入不一样,我看了好久都没改对

#include<bits/stdc++.h>
#define ll long long
#define _for(i,a,b) for(ll i=(a);i<=(b);++i)
#define _rep(i,a,b) for(ll i=(a);i>=(b);--i)
#define INF 1e18
using namespace std;
ll read(){ll 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;}
void write(ll x){if(x<0){putchar('-');x=-x;}if(x>9)write(x/10);putchar(x%10+'0');}
ll t,n1,n2,c1,c2,p,d[10000009];
struct c{ll d,n;};
ll f(ll m){
	ll co=0,u=m;
	deque<c>q1,q2;
	_for(i,1,t){
		ll de=d[i],cn=min(de,m);
		de-=cn,m-=cn;
		if(i-n2>0)q2.push_back((c){i-n2,d[i-n2]});
		while(!q2.empty()){
			if(q2.front().d+n1>i)break;
			q1.push_back(q2.front()),q2.pop_front();
		}
		while(!q1.empty()&&de){
			cn=min(de,q1.front().n),co+=cn*c1,de-=cn,q1.front().n-=cn;
			if(!q1.front().n)q1.pop_front();
		}
		while(!q2.empty()&&de){
			cn=min(de,q2.back().n),co+=cn*c2,de-=cn,q2.back().n-=cn;
			if(!q2.back().n)q2.pop_back();
		}
		if(de)return INF;
	}
	return co+u*p;
}
int main(){
	t=read();_for(i,1,t)d[i]=read();p=read(),n1=read(),c1=read(),n2=read(),c2=read();
	if(c1>c2)swap(n1,n2),swap(c1,c2);
	if(n1<=n2)c2=c1,n2=n1;
	ll l=0,r=t*50,ans=r*p;
	while(r-l>=3){
		ll ml=l+(r-l)/2,mr=ml+1,fml=f(ml);
		if(fml==INF){l=ml+1;continue;}
		ll fmr=f(mr);
		if(fml<fmr)ans=fml,r=mr-1;
		else ans=fmr,l=ml+1;
	}
	_for(i,l,r)ans=min(ans,f(i));
	cout<<ans;
	return 0;
}
2024/3/20 21:22
加载中...