比赛 |
集训 |
评测结果 |
WWWWAAAWWTW |
题目名称 |
兔子集团军 |
最终得分 |
27 |
用户昵称 |
左清源 |
运行时间 |
3.796 s |
代码语言 |
C++ |
内存使用 |
21.72 MiB |
提交时间 |
2025-07-03 11:58:52 |
显示代码纯文本
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
typedef long long ll;
int n,c[N],L[N],R[N],m,top,tot;
ll f[N],v[N],ans=4e18;
struct val{int l,r;}a[N],stk[N],b[N];
bool cmp(val a,val b){return a.l<b.l;}
ll calc(int l,int r){
ll res=0;
for(int i=l;i<=r;i++)res+=v[i]*f[i-l+1]*f[i-l+1];
return res;
}
signed main(){
freopen("RRR.in","r",stdin);
freopen("RRR.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++)scanf("%lld",c+i);
for(int i=1;i<=n;i++)scanf("%lld",v+i);
for(int i=1;i<=n;i++)scanf("%lld",f+i);
for(int i=1;i<=n;i++){
if(!L[c[i]])L[c[i]]=i;
R[c[i]]=i;
}
for(int i=1;i<=n;i++){
if(!L[i])continue;
a[++m]=val{L[i],R[i]};
}
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++){
while(top&&a[i].l>stk[top].r)b[++tot]=stk[top--];
while(top&&a[i].r>stk[top].r){
int r=a[i].r;a[i]=val{stk[top].l,r};top--;
}
stk[++top]=a[i];
}
while(top)b[++tot]=stk[top--];
for(int i=1;i<=tot;i++)ans=min(ans,calc(b[i].l,b[i].r));
printf("%lld\n",ans);
return 0;
}