我使用了 dp+贪心 的做法。贪心结论是,在 p_i 使用一操作是不劣的,求具体的证明。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=500005;
int a[N],b[N],c[N],n,q,m,sum1[N],p[N],s[N],f[N],g[N];
void solve(){
cin>>m;
for(int i=1;i<=m;++i){
cin>>p[i];
}
int ans=0;
for(int i=1;i<=m;++i){
f[i]=min(a[p[i]-1]+g[i-1],f[i-1]+s[p[i]-1]-s[p[i-1]]);
g[i]=g[i-1]+c[p[i]];
}
cout<<min(g[m]+a[n],f[m]+s[n]-s[p[m]])<<'\n';
for(int i=1;i<=m;++i) g[i]=f[i]=0;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i) cin>>b[i],s[i]=s[i-1]+b[i];
for(int i=1;i<=n;++i) cin>>c[i];
for(int i=1;i<=n;++i) a[i]=min(a[i],a[i-1]+b[i]);
cin>>q;
while(q--){
solve();
}
return 0;
}