結果
| 問題 |
No.2759 Take Pictures, Elements?
|
| コンテスト | |
| ユーザー |
Tatsu_mr
|
| 提出日時 | 2024-05-18 01:01:52 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 669 ms / 2,000 ms |
| コード長 | 2,707 bytes |
| コンパイル時間 | 2,240 ms |
| コンパイル使用メモリ | 210,632 KB |
| 実行使用メモリ | 261,660 KB |
| 最終ジャッジ日時 | 2025-06-20 13:19:40 |
| 合計ジャッジ時間 | 10,253 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 21 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct Edge {
int to;
long long cost;
};
struct Dijkstra {
vector<vector<Edge>> g;
int n, x;
vector<long long> dist;
vector<int> prev;
Dijkstra(vector<vector<Edge>> g_, int x_) : g(g_), n(g.size()), x(x_), dist(n, 1000000000000000000), prev(n) {
build();
}
void build() {
vector<bool> visit(n, false);
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> que;
dist[x] = 0LL;
que.push({dist[x], x});
while (!que.empty()) {
int v = que.top().second;
que.pop();
if (visit[v]) {
continue;
}
visit[v] = true;
for (auto e : g[v]) {
int nv = e.to;
long long d = e.cost;
if (dist[nv] > dist[v] + d) {
dist[nv] = dist[v] + d;
prev[nv] = v;
que.push({dist[nv], nv});
}
}
}
}
long long getdist(int y) {
return dist[y];
}
vector<int> getroute(int y) {
int cur = y;
vector<int> res = {cur};
while (cur != x) {
cur = prev[cur];
res.push_back(cur);
}
reverse(res.begin(), res.end());
return res;
}
};
int main() {
int n, q;
cin >> n >> q;
vector<int> a(n), b(q);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < q; i++) {
cin >> b[i];
}
//(i, j) クエリをi個処理して現在jにいる
vector<vector<Edge>> g((q + 1) * n);
for (int i = 0; i <= q; i++) {
for (int j = 0; j < n - 1; j++) {
//(i, j) <-> (i, j+1)
g[n * i + j].push_back({n * i + j + 1, 1LL});
g[n * i + j + 1].push_back({n * i + j, 1LL});
}
}
for (int i = 1; i <= q; i++) {
for (int j = 0; j < n; j++) {
//(i-1, j-1) -> (i, j) (cost 1)
//(i-1, j) -> (i, j) (cost 0)
//(i-1, j+1) -> (i, j) (cost 1)
if (b[i - 1] == a[j]) {
if (j >= 1) {
g[n * (i - 1) + j - 1].push_back({n * i + j, 1LL});
}
g[n * (i - 1) + j].push_back({n * i + j, 0LL});
if (j < n - 1) {
g[n * (i - 1) + j + 1].push_back({n * i + j, 1LL});
}
}
}
}
Dijkstra D(g, 0);
long long ans = 1000000000000000000;
for (int j = 0; j < n; j++) {
ans = min(ans, D.getdist(n * q + j));
}
cout << ans << endl;
}
Tatsu_mr