結果
問題 |
No.2146 2 Pows
|
ユーザー |
|
提出日時 | 2025-07-15 19:24:46 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 251 ms / 3,000 ms |
コード長 | 2,180 bytes |
コンパイル時間 | 6,762 ms |
コンパイル使用メモリ | 356,384 KB |
実行使用メモリ | 20,168 KB |
最終ジャッジ日時 | 2025-07-15 19:25:00 |
合計ジャッジ時間 | 13,011 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 32 |
ソースコード
#pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> // #include <atcoder/all> // using namespace atcoder; using namespace std; using ll = long long; using pll = pair<ll, ll>; using vll = vector<ll>; using vvll = vector<vll>; using vpll = vector<pll>; using vvpll = vector<vpll>; #define rep(i, l, r) for (ll i = l; i < ll(r); i++) #define rrep(i, l, r) for (ll i = ll(r-1); i >= l; i--) #pragma region // doubling template <typename T> T fpow(T base, T id, ll exp, std::function<T(T, T)> bop); template <typename T> T fpow(T base, ll exp); template <typename T> T fpow(T base, ll exp) { T ans = 1; while (exp > 0) { if (exp & 1ll) { ans = ans * base; } base = base * base; exp >>= 1; } return ans; } template <typename T> T fpow(T base, T id, ll exp, std::function<T(T, T)> bop) { T ans = id; while (exp > 0) { if (exp & 1ll) { ans = bop(ans, base); } base = bop(base, base); exp >>= 1; } return ans; } #pragma endregion #pragma region #pragma endregion #include <atcoder/all> using namespace atcoder; using mint = modint998244353; int main() { ll n, a, b, c; cin >> n >> a >> b >> c; vll ans1(n, LLONG_MAX), ans2(n, LLONG_MAX); priority_queue<tuple<ll, ll, bool>, vector<tuple<ll, ll, bool>>, greater<tuple<ll, ll, bool>>> pq; pq.emplace(a + b, 1, true); pq.emplace(a + b, 1, false); set<tuple<ll, ll, bool>> s; while (pq.size()) { auto [cost, value, addoneable] = pq.top(); // cerr << cost << " " << value << " " << addoneable << endl; pq.pop(); if (addoneable) { if (ans1[value] <= cost) continue; ans1[value] = cost; } else { if (ans2[value] <= cost) continue; ans2[value] = cost; } pq.emplace(cost + c, (value * 2) % n, false); pq.emplace(cost + a + b + c, (value * 2 + 1) % n, true); if (addoneable) pq.emplace(cost + a, (value + 1) % n, true); } rep(i, 0, n) { cout << min(ans1[i], ans2[i]) << "\n"; } cout << flush; }