結果
問題 |
No.3162 Five Two Three
|
ユーザー |
|
提出日時 | 2025-05-05 00:22:35 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,002 bytes |
コンパイル時間 | 2,144 ms |
コンパイル使用メモリ | 214,872 KB |
実行使用メモリ | 7,848 KB |
最終ジャッジ日時 | 2025-05-05 01:36:30 |
合計ジャッジ時間 | 8,846 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 WA * 1 |
other | AC * 78 WA * 109 |
ソースコード
#include <bits/stdc++.h> using namespace std; using int64 = long long; using i128 = __int128_t; static inline i128 key(int64 a, int64 b){ return (i128(a) << 64) | (uint64_t)b; } // 各 pair (pre,cur) の情報 struct Node{ int64 pre, cur; i128 par; // 親 pair の key (root だけ -1) bool usedZ; }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int64 X, Y, Z; if(!(cin >> X >> Y >> Z)) return 0; /* --- 3 項で済む? --- */ if (llabs(X - Y) == Z){ cout << 3 << '\n' << X << ' ' << Z << ' ' << Y << '\n'; return 0; } /* --- Z = 0 で片端が 0 のときは長さ 5 で決着 --- */ if (Z == 0){ if (X == 0 && Y == 0){ cout << 3 << "\n0 0 0\n"; return 0; } if (X == 0){ cout << 5 << '\n' << 0 << ' ' << Y << ' ' << Y << ' ' << 0 << ' ' << Y << '\n'; return 0; } if (Y == 0){ cout << 5 << '\n' << X << " 0 " << X << ' ' << X << " 0\n"; return 0; } } /* ---------- 双方向反復深化 ----------- */ const int MAXD = 90; // 10^12 ならこれで十分 for (int D = 4; D <= MAXD; ++D){ int Llim = D / 2, Rlim = D - Llim; unordered_map<i128, Node> L, R; queue<Node> qL, qR; // 左側の root (dummy_pre, X) int64 dummyL = (X == 0 ? 1 : 0); Node rootL { dummyL, X, -1, (X == Z) }; qL.push(rootL); L.emplace(key(dummyL, X), rootL); // 右側の root (Y, dummy_suf) int64 dummyR = (Y == 0 ? 1 : 0); Node rootR { Y, dummyR, -1, (Y == Z) }; qR.push(rootR); R.emplace(key(Y, dummyR), rootR); auto expand = [&](queue<Node>& Q, unordered_map<i128,Node>& mp, int lim){ while(!Q.empty() && (int)mp.size() <= (1<<22)){ // 軽い安全弁 Node cur = Q.front(); if (--lim < 0) break; Q.pop(); int64 a = cur.pre, b = cur.cur; for(int s = 0; s < 2; ++s){ int64 c = (s ? llabs(a - b) : a + b); if (c < 0 || c > 1000000000000LL) continue; i128 k = key(b, c); if (mp.count(k)) continue; Node nxt { b, c, key(a, b), cur.usedZ || (c == Z) }; mp.emplace(k, nxt); Q.push(nxt); } } }; expand(qL, L, Llim); expand(qR, R, Rlim); /* --- 衝突検出 --- */ for (auto &kv : L){ auto &ln = kv.second; // (p,q) int64 p = ln.pre, q = ln.cur; auto it = R.find(key(q, p)); // (q,r) があるか? if (it == R.end()) continue; auto &rn = it->second; // (q,r) int64 r = rn.cur; if ( llabs(p - r) != q ) continue; if ( !(ln.usedZ || rn.usedZ) ) continue; // Z を含まない /* ---- 経路復元 ---- */ vector<int64> left, right; // 左側(X → … → q): cur を辿る for (i128 k = key(p,q); k != -1; k = L[k].par){ left.push_back(L[k].cur); } reverse(left.begin(), left.end()); // X から q へ // 右側(q → … → Y): cur を辿る for (i128 k = key(q,r); k != -1; k = R[k].par){ if (k != key(q,r)) // q は重複させない right.push_back(R[k].cur); } /* 出力 */ vector<int64> ans = left; ans.insert(ans.end(), right.begin(), right.end()); cout << ans.size() << '\n'; for (size_t i = 0; i < ans.size(); ++i){ cout << ans[i] << (i + 1 == ans.size() ? '\n' : ' '); } return 0; } } cout << -1 << '\n'; return 0; }