結果
問題 | No.3 ビットすごろく |
ユーザー |
![]() |
提出日時 | 2024-10-01 10:27:22 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 5 ms / 5,000 ms |
コード長 | 2,486 bytes |
コンパイル時間 | 3,332 ms |
コンパイル使用メモリ | 261,904 KB |
実行使用メモリ | 6,272 KB |
最終ジャッジ日時 | 2024-10-01 10:27:28 |
合計ジャッジ時間 | 4,252 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 33 |
ソースコード
#include <bits/stdc++.h>#define For(i, a, b) for(long long i = a; i < b; i++)#define rep(i, n) For(i, 0, n)#define rFor(i, a, b) for(long long i = a; i >= b; i--)using namespace std;using lint = long long;template <class T>struct Edge {int from, to;T cost;int idx;Edge() {}Edge(int to_) : to(to_) {}Edge(int to_, T cost_) : to(to_), cost(cost_) {}Edge(int from_, int to_, int idx_) : from(from_), to(to_), idx(idx_) {}Edge(int from_, int to_, T cost_, int idx_) : from(from_), to(to_), cost(cost_), idx(idx_) {}};template <class T> using Graph = vector<vector<Edge<T>>>;using graph = Graph<long long>;using edge = Edge<long long>;#define add emplace_backstruct Dijkstra {private:graph g;int n, s;vector<long long> d;vector<edge> prev;vector<bool> visit;priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;public:Dijkstra(graph g_, int s_) : g(g_), n(g.size()), s(s_), d(n, 1000000000000000000), prev(n), visit(n, false) {d[s] = 0LL;pq.emplace(d[s], s);while (!pq.empty()) {int v = pq.top().second;pq.pop();if (visit[v]) {continue;}visit[v] = true;for (auto e : g[v]) {int nv = e.to;long long nc = e.cost;if (d[nv] > d[v] + nc) {d[nv] = d[v] + nc;prev[nv] = e;pq.emplace(d[nv], nv);}}}}vector<long long> dists() {return d;}long long dist(int t) {return d[t];}vector<edge> route(int t) {if (s == t || d[t] == 1000000000000000000) {return {};}vector<edge> res;int cur = t;while (cur != s) {res.emplace_back(prev[cur]);cur = prev[cur].from;}reverse(res.begin(), res.end());return res;}};int main() {int n;cin >> n;graph g(n);for (int i = 0; i < n; i++) {int d = __builtin_popcount(i + 1);if (i - d > 0) {g[i].add(i - d, 1LL);}if (i + d < n) {g[i].add(i + d, 1LL);}}lint ans = Dijkstra(g, 0).dist(n - 1);cout << (ans == 1000000000000000000 ? -1 : ans + 1) << endl;}