CF1799D2 Hot Start Up (hard version) 题解
toolong114514 · · 题解
CSP-S 2024 原题居然还能交题解?
解题思路
定义
对于当前程序,我们有两种运行方法:接着上一个程序所在的 CPU 继续运行、换一个 CPU 运行。当前程序冷热启动情况,结合状态设计是显然的。
所以有转移方程如下:
时间复杂度为
我们不妨搞一个滚动数组,压掉
可以显然地观察到,转移可以表示为数组
打一个线段树去维护可以做到
事实上还可以做到更优。
我们考虑维护一个
对于整体转移,继承 CPU运行,直接给
对于单点取
时间复杂度
参考代码
#include<iostream>
#include<cstring>
using namespace std;
#define int long long
const int INF=0x3f3f3f3f3f3f3f3f;
const int N=1e6+10;
int a[N],v1[N],v2[N],f[N];
int t,n,k,ans,laz,minn;
void read(int &x) {
x=0;int f=1;
char s=getchar();
for(;s<'0'||s>'9';s=getchar()) f=s=='-'?-f:f;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
x*=f;
}
signed main(){
ios::sync_with_stdio(false);
read(t);
while(t--){
read(n),read(k);
for(int i=1;i<=n;i++){
read(a[i]);
}
for(int i=1;i<=k;i++){
read(v1[i]);
}
for(int i=1;i<=k;i++){
read(v2[i]);
}
for(int i=1;i<=k;i++){
f[i]=INF;
}
laz=minn=0;
for(int i=1;i<=n;i++){
if(a[i]==a[i-1]){
laz+=v2[a[i]];
f[a[i-1]]=min(f[a[i]],minn-v2[a[i]]+v1[a[i]]);
}else{
laz+=v1[a[i]];
f[a[i-1]]=min(f[a[i]]-v1[a[i]]+v2[a[i]],minn);
}
minn=min(minn,f[a[i-1]]);
}
cout<<minn+laz<<'\n';
}
return 0;
}
AC record
Written by toolong114514 on 2025.8.16.