专栏文章
题解:P6820 [PA 2012 Finals] Two Cakes
P6820题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minpmydr
- 此快照首次捕获于
- 2025/12/02 06:17 3 个月前
- 此快照最后确认于
- 2025/12/02 06:17 3 个月前
看了很久才看明白是怎么优化到一维的,所以写了这篇题解。
设 表示第一个序列写到 ,第二个序列写道 时的答案,朴素转移方程为:
当 时 :
否则 :。
否则 :。
令
那么:
那么:
所以对于第一种转移
对于第二种转移
这就意味着,对于 的位置, 的值不会改变,这样在转移时就不用在意。
由于 所以答案需要加上 。
接着,为了压缩为一维,我们需要找到一种对于 的一种映射方式,例如下面代码中将 映射为 , 因为这样映射只有差值相同映射值才会相同,而由前面的结论可知,差值相同时 的值相同,所以这种映射是正确的。
代码中的 对应题解中的 。
CPP#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int n,a[N],p[N],f[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++){int x; scanf("%d",&x); p[x]=i;}
for(int i=n;i<=2*n;i++) f[i]=i-n;
for(int i=1;i<=n;i++){
f[p[a[i]]+n-i]=min(f[p[a[i]]+n-i+1],f[p[a[i]]+n-i-1]+1);
}
printf("%d\n",f[n]+n);
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...