P9744 题解(2023 激励计划评分 8)「KDOI-06-S」消除序列 题解
对于在
接下来考虑每一次询问,有几种策略:
最朴素的:在
以及:对于每一个
同时,在处理
其中,
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 5, M = 1e9 + 7;
int n, a[N], b[N], c[N], fb[N], fc[N], fr[N], q, m, p[N];
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n;
for(int i = 1; i <= n; i++) cin>>a[i];
for(int i = 1; i <= n; i++) cin>>b[i];
for(int i = 1; i <= n; i++) cin>>c[i];
for(int i = n; i >= 1; i--) fb[i] = fb[i + 1] + b[i];
for(int i = 1; i <= n; i++) a[i] = min(a[i], a[i - 1] + b[i]);
cin>>q;
while(q--) {
cin>>m;
for(int i = 1; i <= m; i++) {
cin>>p[i];
fc[i] = fc[i - 1] + c[p[i]];
}
fr[m + 1] = 0;
for(int i = m; i >= 1; i--) fr[i] = fr[i + 1] + b[p[i]];
int ans = a[n] + fc[m];
for(int i = 1; i <= m; i++)
ans = min(ans, min(a[p[i] - 1] + fc[i - 1], a[p[i]] + fc[i]) + fb[p[i] + 1] - fr[i + 1]);
cout<<ans<<endl;
}
return 0;
}