题解:P6820 [PA 2012 Finals] Two Cakes
蓝色的思维题能不能去死啊。
首先考虑
有递推式如下:
考虑优化。由于
二分查找位置的方法:由于平移时
:::info[正解代码]
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll N = 1e6 + 5;
ll n, a[N], b[N], pos[N], dp[N];
vector<ll> vec[N << 1];
ll dfs(ll i, ll j) {
if (a[i] == b[j]) {
if (dp[i] != -1) {
return dp[i];
}
return dp[i] = min(dfs(i - 1, j), dfs(i, j - 1)) + 1;
}
ll d = i - j + n;
ll p = lower_bound(vec[d].begin(), vec[d].end(), i) - vec[d].begin() - 1;
if (p == -1) {
return max(i, j);
}
p = vec[d][p];
return dfs(p, j - (i - p)) + i - p;
}
void solve() {
memset(dp, -1, sizeof dp);
scanf("%lld", &n);
for (ll i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
pos[a[i]] = i;
}
for (ll i = 1; i <= n; i++) {
scanf("%lld", &b[i]);
vec[pos[b[i]] - i + n].push_back(pos[b[i]]);
}
cout << dfs(n, n) << "\n";
}
int main() {
solve();
return 0;
}
:::