题目链接:https://www.nowcoder.com/acm/contest/140/G
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+10;
struct node
{
ll x,w;
}a[N];
using namespace std;
ll n,T;
ll prew[N],prec[N],sufw[N],sufc[N];
ll cal_pre(ll l,ll r)
{
return prec[r]-prec[l-1]-prew[l-1]*(a[r].x-a[l-1].x);
}
ll cal_suf(ll l,ll r)
{
return sufc[l]-sufc[r+1]-sufw[r+1]*(a[r+1].x-a[l].x);
}
bool check(ll num)
{
ll num2=num/2+1;
ll l=1,r=1,mid=1;
while(1)
{
while(r<=n&&prew[r]-prew[l-1]<num)r++;
while(mid<=n&&prew[mid]-prew[l-1]<num2)mid++;
if(r>n||mid>n)break;
ll s=cal_pre(l,mid)+cal_suf(mid,r-1)+(num-(prew[r-1]-prew[l-1]))*(a[r].x-a[mid].x);
if(s<=T)return true;
l++;
}
l=r=mid=n;
while(1)
{
while(l>=1&&prew[r]-prew[l-1]<num)l--;
while(mid>=2&&prew[mid]-prew[l-1]<num2)mid--;
if(l<1||mid<2)break;
ll s=cal_pre(l+1,mid)+cal_suf(mid,r)+(num-(prew[r]-prew[l]))*(a[mid].x-a[l].x);
if(s<=T)return true;
r--;
}
return false;
}
int main()
{
scanf("%lld%lld",&n,&T);
T/=2;
ll l=0,r=0;
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i].x);
}
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i].w);
}
for(ll i=1;i<=n;i++)
{
prew[i]=prew[i-1]+a[i].w;
prec[i]=prec[i-1]+prew[i-1]*(a[i].x-a[i-1].x);
}
for(ll i=n;i>=1;i--)
{
sufw[i]=sufw[i+1]+a[i].w;
sufc[i]=sufc[i+1]+sufw[i+1]*(a[i+1].x-a[i].x);
r+=a[i].w;
}
while(l<r)
{
ll mid=(l+r+1)>>1;
if(check(mid))
{
l=mid;
}
else r=mid-1;
}
printf("%lld\n",l);
return 0;
}