比赛 |
集训 |
评测结果 |
WWWWAAATTTA |
题目名称 |
兔子集团军 |
最终得分 |
36 |
用户昵称 |
淮淮清子 |
运行时间 |
7.142 s |
代码语言 |
C++ |
内存使用 |
18.45 MiB |
提交时间 |
2025-07-03 12:12:41 |
显示代码纯文本
#include<iostream>
#include<vector>
#include<deque>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 5;
const ll INF = 1e18;
const int MAXX = 2147483647;
int c[MAXN], v[MAXN], f[MAXN];
int A[MAXN], B[MAXN];
int n;
int main(){
freopen("RRR.in","r",stdin);
freopen("RRR.out","w",stdout);
cin.tie(0) -> ios::sync_with_stdio(0);
cin >> n;
for(int i = 0;i < n;i ++) cin >> c[i];
for(int i = 0;i < n;i ++) cin >> v[i];
for(int i = 0;i < n;i ++) cin >> f[i];
for(int i = 0;i < n;i ++) A[i] = MAXX;
for(int i = 0;i < n;i ++) B[i] = -1;
for(int i = 0;i < n;i ++){
if(A[c[i]] == MAXX) A[c[i]] = i;
B[c[i]] = i;
}
bool flag = true;
for(int i = 0;i < n;i ++){
if(f[i] != 1){
flag = false;
break;
}
}
ll ans = INF;
if(n <= 5000){
for(int l = 0;l < n;l ++){
int min_f = MAXX;
int max_l = -1;
ll cost = 0;
for(int r = l;r < n;r ++){
if(A[c[r]] < min_f) min_f = A[c[r]];
if(B[c[r]] > max_l) max_l = B[c[r]];
int d = r - l + 1;
cost += (ll)v[r] * (ll)f[d - 1] * (ll)f[d - 1];
if(min_f >= l && max_l <= r) if(cost < ans) ans = cost;
}
}
}
else{
if(flag){
vector<ll> sum(n + 1, 0);
for(int i = 0;i < n;i ++) sum[i + 1] = sum[i] + v[i];
deque<int> dq_mn, dq_mx;
int l = 0;
for(int r = 0;r < n;r ++){
while(!dq_mn.empty() && A[c[dq_mn.back()]] >= A[c[r]]) dq_mn.pop_back();
dq_mn.push_back(r);
while(!dq_mx.empty() && B[c[dq_mx.back()]] <= B[c[r]]) dq_mx.pop_back();
dq_mx.push_back(r);
while(l <= r){
while(!dq_mn.empty() && dq_mn.front() < l) dq_mn.pop_front();
while(!dq_mx.empty() && dq_mx.front() < l) dq_mx.pop_front();
if(dq_mn.empty() || dq_mx.empty()) break;
int mnA = A[c[dq_mn.front()]];
int mxB = B[c[dq_mx.front()]];
if(mnA < l || mxB > r) l++;
else break;
}
if(!dq_mn.empty() && !dq_mx.empty()){
int mnA = A[c[dq_mn.front()]];
int mxB = B[c[dq_mx.front()]];
if(mnA >= l && mxB <= r){
ll cnt = sum[r + 1] - sum[l];
if(cnt < ans) ans = cnt;
}
}
}
}
else {
vector<bool> vis(n, false);
for(int i = 0;i < n;i ++) if(A[c[i]] == i) vis[i] = true;
for(int l = 0;l < n;l ++){
if(!vis[l]) continue;
int r = l;
int min_f = A[c[l]];
int max_l = B[c[l]];
while(r < n && (min_f < l || max_l > r)){
r ++;
if(r < n){
min_f = min(min_f, A[c[r]]);
max_l = max(max_l, B[c[r]]);
}
}
if(r >= n) continue;
ll cnt = 0;
for(int i = l;i <= r;i ++){
int d = i - l + 1;
cnt += (ll)v[i] * (ll)f[d - 1] * (ll)f[d - 1];
}
if(cnt < ans) ans = cnt;
}
}
}
if(ans == INF) ans = 0;
cout << ans << '\n';
return 0;
}