求查错
查看原帖
求查错
241838
microchip楼主2023/10/16 14:47

很抱歉时间仓促,快下课了,所以没时间挂思路了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;
}
2023/10/16 14:47
加载中...