记录编号 |
602317 |
评测结果 |
AAAAAAAAAAA |
题目名称 |
4162.兔子集团军 |
最终得分 |
100 |
用户昵称 |
左清源 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.617 s |
提交时间 |
2025-07-03 15:48:36 |
内存使用 |
23.41 MiB |
显示代码纯文本
#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;
queue<int>q;
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;
}
void solve(int l,int r){
int mid=(l+r)>>1,i=mid,j=mid;
while(q.size())q.pop();
q.push(c[mid]);bool flag=0;
while(q.size()){
int x=q.front();q.pop();
if(L[x]<l||r<R[x]){
flag=1;
break;
}else{
for(int k=i-1;k>=L[x];k--)q.push(c[k]);
for(int k=j+1;k<=R[x];k++)q.push(c[k]);
i=min(i,L[x]),j=max(j,R[x]);
}
}
if(!flag)ans=min(ans,calc(i,j));
if(l==r)return;
else solve(l,mid),solve(mid+1,r);
return;
}
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;
}
solve(1,n);
printf("%lld\n",ans);
return 0;
}