利用C与A组合,由最优性质得:存在继承关系,预处理;
若利用A与C组合,只能暴力求解;
启发:多视角,观察连续分布个体间的继承关系(传播关系);
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAX=1e6+5,max_n=1e6;
int n,m,c[MAX],cnt[MAX];
struct node{int x,y,v;}a[MAX];
bool cmp(const node a,const node b){if(a.x==b.x)return a.y>b.y;else return a.x<b.x;}
bool cmp2(const node a,const node b){if(a.v==b.v)return a.x<b.x;else return a.v<b.v;}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i].x;
for(int i=1;i<=n;i++)cin>>a[i].y;
for(int i=1;i<=n;i++)a[i].v=a[i].x-a[i].y;
for(int i=1;i<=m;i++)cin>>c[i];
sort(a+1,a+1+n,cmp);
int pos=1,in=a[pos].x,out=a[pos].y;
for(int i=1;i<=max_n;i++){
while(pos<=n&&a[pos].x<=i){
if(a[pos].x-a[pos].y<in-out)in=a[pos].x,out=a[pos].y;
pos++;
}
if(in>i){cnt[i]=0;continue;}
int tem=(i-in)/(in-out)+1;
cnt[i]+=tem;
cnt[i]+=cnt[i-tem*(in-out)];
}
sort(a+1,a+1+n,cmp2);
in=a[1].x,out=a[1].y;
int ans=0;
for(int i=1;i<=m;i++){
if(c[i]>max_n){
int tem=(c[i]-in)/(in-out)+1;
ans+=tem;
ans+=cnt[c[i]-tem*(in-out)];
}else{
ans+=cnt[c[i]];
}
}
cout<<ans*2;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}