RT。
赛时写了个玄学二分+分讨过了。
求分析复杂度,我觉得不对。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int N=207;
int n,m,a[N],p[N],b[N],q[N];
inline bool check(int mn,int x){
for(int i=1;i<=n;i++){
int num=0;
num=ceil(mn*1.0/a[i])*p[i];
num=min(num,int(ceil(mn*1.0/b[i])*q[i]));
int sum=0;
for(int j=1;j*p[i]+j*q[i]<=x&&j*a[i]+j*b[i]<=mn;j++){
sum=mn-j*a[i]-j*b[i];
sum=min(int(ceil(sum*1.0/a[i]))*p[i],int(ceil(sum*1.0/b[i]))*q[i]);
num=min(num,j*p[i]+j*q[i]+sum);
}
num=min(int(ceil(mn*1.0/(a[i]*1.0+b[i]*1.0)))*(p[i]+q[i]),num);
if(num>x)return false;
x-=num;
}
return true;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i]>>p[i]>>b[i]>>q[i];
int l=0,r=2e9,res=0;
while(l<=r){
int mid=(l+r)/2;
if(check(mid,m))l=mid+1,res=mid;
else r=mid-1;
}
if(res>=1e9){
int l=0,r=1e14,res=0;//最大范围
while(l<=r){
int mid=(l+r)/2;
if(check(mid,m))l=mid+1,res=mid;
else r=mid-1;
}
cout<<res<<"\n";
}else cout<<res;
}