我没搞明白啊,明明B1过了,为什么B2没有过呢,我觉得是一样的啊
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ri register int
using namespace std;
typedef long long ll;
const int N=200010;
int T;
ll n,m,ans;
struct node{ll x,tot;}b[N];
bool operator <(const node &p1,const node &p2){return p1.x<p2.x;}
void solve()
{
scanf("%lld %lld",&n,&m);
for(ri i=1;i<=n;i++) scanf("%lld",&b[i].x);
for(ri i=1;i<=n;i++) scanf("%lld",&b[i].tot);
sort(b+1,b+n+1);
ans=0;
for(ri i=n-1;i>=1;i--)
if(b[i+1].x-b[i].x==1)
{
ll t1=min(m/b[i].x,b[i].tot),t2=min(m/b[i+1].x,b[i+1].tot);//t1=3 t2=4
if(b[i].x*t1+b[i+1].x*t2<=m) ans=max(ans,b[i].x*t1+b[i+1].x*t2);
else
{
ll x1=m-b[i].x*t1,x2=m-b[i+1].x*t2;
ans=max(ans,b[i].x*t1+min(x1/b[i+1].x,b[i+1].tot)*b[i+1].x);
ans=max(ans,b[i+1].x*t2+min(x2/b[i].x,b[i].tot)*b[i].x);
if(t1)
ans=max(ans,b[i].x*(t1-1)+min((x1+b[i].x)/b[i+1].x,b[i+1].tot)*b[i+1].x);
if(t2)
ans=max(ans,b[i+1].x*(t2-1)+min((x2+b[i+1].x)/b[i].x,b[i].tot)*b[i].x);
}
}
for(ri i=1;i<=n;i++) ans=max(ans,min(m/b[i].x,b[i].tot)*b[i].x);
printf("%lld\n",ans);
}
int main()
{
scanf("%d",&T);
while(T--) solve();
return 0;
}