很抱歉时间仓促,快下课了,所以没时间挂思路了QwQ
有时间我会补上的
#include<bits/stdc++.h>
//#define MAXN 9223372036854775807
using namespace std;
int n,q,m,p,num[500050],k;
long long ans,now,tmp,qzh[500050],f[500050],a[500050],b[500050],c[500050];
//a : 标记 1~i 的代价
//b : 标记 i 的代价
//c : 取消标记 i 的代价
//P : 不被标记的点
int main()
{
// freopen("reserve8.in","r",stdin);
// freopen("output.txt","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
qzh[i]=qzh[i-1]+b[i];
}for(int i=1;i<=n;i++)scanf("%d",&c[i]);
for(int i=1;i<=n;i++){
if(i==1)f[i]=min(a[i],b[i]);
else f[i]=min(a[i],b[i]+f[i-1]);
}scanf("%d",&q);
while(q--){
now=0;k=0;
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&p);
num[++k]=p;
if(k!=1)now+=qzh[num[k]-1]-qzh[num[k-1]];
}now+=qzh[num[1]-1];
now+=qzh[n]-qzh[num[k]];
ans=now;
for(int i=1;i<=k;i++){
now-=qzh[num[i]-1]-qzh[num[i-1]];
tmp=now+f[num[i]-1];
for(int j=1;j<i;j++)tmp+=c[j];
ans=min(ans,tmp);
}tmp=f[n];
for(int i=1;i<=k;i++)tmp+=c[num[i]];
ans=min(ans,tmp);
printf("%lld\n",ans);
}
return 0;
}