记录编号 602350 评测结果 AAAAAAAAAAA
题目名称 4162.兔子集团军 最终得分 100
用户昵称 Gravatar淮淮清子 是否通过 通过
代码语言 C++ 运行时间 2.865 s
提交时间 2025-07-03 16:54:21 内存使用 27.55 MiB
显示代码纯文本
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
const ll INF = 1e18;

int n;
int c[N];
int A[N], B[N];
int vis[N], T = 0;
ll v[N], f[N];
ll ans = INF;

void solve(int l, int r){
    if (l > r) return;
    int mid = (l + r) >> 1;
    int i = mid, j = mid;
    queue<int> q;T ++;
    q.push(c[mid]);
    vis[c[mid]] = T;
    bool flag = true;
    while(!q.empty() && flag){
        int x = q.front();
        q.pop();
        if(A[x] < l || B[x] > r){
            flag = false;
            break;
        }
        for(int k = i - 1;k >= A[x];k --){
            if(vis[c[k]] != T){
                vis[c[k]] = T;
                q.push(c[k]);
            }
        }
        for(int k = j + 1;k <= B[x];k ++){
            if(vis[c[k]] != T){
                vis[c[k]] = T;
                q.push(c[k]);
            }
        }
        i = min(i, A[x]);
        j = max(j, B[x]);
    }
    if(flag){
        ll cost = 0;
        for (int k = i, d = 1;k <= j;k ++,d ++){
            cost += v[k] * f[d] * f[d];
        }
        ans = min(ans, cost);
    }
    solve(l, mid - 1);
    solve(mid + 1, r);
}

int main(){
    scanf("%d", &n);
    for(int i = 1;i <= n;i ++) scanf("%d", &c[i]);
    for(int i = 1;i <= n;i ++) scanf("%lld", &v[i]);
    for(int i = 1;i <= n;i ++) scanf("%lld", &f[i]);
    memset(A, 0x3f, sizeof(A));
    memset(B, 0, sizeof(B));
    for(int i = 1;i <= n;i ++){
        A[c[i]] = min(A[c[i]], i);
        B[c[i]] = max(B[c[i]], i);
    }
    memset(vis, 0, sizeof(vis));
    T = 0;
    solve(1, n);
    printf("%lld\n", ans);
    return 0;
}