我二分加一个递推勉强过去
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<string>
#include<time.h>
using namespace std;
typedef long long ll;
const int N=1000005;
int n,m;
ll a[N],b[N],c[N],d1[N],d2[N],e1[N],e2[N];
ll l,r=1145141919810,mid,tmp,k;
bool check(ll k){
for(int i=1;i<=n;i++){
e1[i]=e1[i-1]-d1[i-1]+d1[max((ll)0,i-k-1)];
if(c[i])e1[i]+=k;
}
for(int i=n;i>=0;i--){
e2[i]=e2[i+1]-d2[i+1]+d2[min((ll)n+1,i+k+1)];
if(c[i])e2[i]+=k;
tmp=e1[i]+e2[i];
if(c[i])tmp-=k;
if(tmp<a[i])return 0;
}
return 1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++){
scanf("%d",&b[i]);
c[b[i]]=1;
}
for(int i=1;i<=n;i++)d1[i]=d1[i-1]+c[i];
for(int i=n;i>=0;i--)d2[i]=d2[i+1]+c[i];
while(l<r){
mid=l+r>>1;
if(check(mid))r=mid;
else l=mid+1;
}
printf("%lld",l);
return 0;
}