比赛 集训 评测结果 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;
}