結果
問題 |
No.5022 XOR Printer
|
ユーザー |
![]() |
提出日時 | 2025-07-26 14:50:49 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 3,127 bytes |
コンパイル時間 | 3,132 ms |
コンパイル使用メモリ | 287,556 KB |
実行使用メモリ | 7,716 KB |
スコア | 4,575,659,115 |
最終ジャッジ日時 | 2025-07-26 14:50:55 |
合計ジャッジ時間 | 5,802 ms |
ジャッジサーバーID (参考情報) |
judge6 / judge4 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
// 1.ベースライン,何もしない // 2.最適なsを求め,全セルをフリップ→? // 3.最大桁を1にする // 4.2桁目も1にする→壊れている // 5.2桁目も1にする #include <bits/stdc++.h> using namespace std; #define rep(i,a,b) for (int i = (a); i < (b); i++) int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, t; cin >> n >> t; vector<vector<int>> A(n, vector<int>(n)); rep(i, 0, n) rep(j, 0, n) cin >> A[i][j]; vector<char> ops; int cx = 0, cy = 0; int s = 0; // 移動ヘルパー: (cx,cy) から (tx,ty) へ auto moveTo = [&](int tx, int ty) { while (cx < tx) { ops.push_back('D'); ++cx; } while (cx > tx) { ops.push_back('U'); --cx; } while (cy < ty) { ops.push_back('R'); ++cy; } while (cy > ty) { ops.push_back('L'); --cy; } }; // --- Phase1: 最上位ビット bit1 を 1 にする --- int bit1 = -1; rep(i, 0, n) rep(j, 0, n) if (A[i][j] > 0) { int b = 31 - __builtin_clz(A[i][j]); bit1 = max(bit1, b); } while (bit1 >= 0) { bool ok = false; rep(i, 0, n) rep(j, 0, n) { if ((A[i][j] >> bit1) & 1) { ok = true; break; } } if (ok) break; --bit1; } if (bit1 < 0) return 0; int bi = -1, bj = -1, bd = INT_MAX; rep(i, 0, n) rep(j, 0, n) { if ((A[i][j] >> bit1) & 1) { int d = abs(i - cx) + abs(j - cy); if (d < bd) { bd = d; bi = i; bj = j; } } } moveTo(bi, bj); ops.push_back('C'); s ^= A[bi][bj]; // コピーで s 更新 moveTo(0, 0); rep(i, 0, n) { if (i % 2 == 0) { rep(j, 0, n) { moveTo(i, j); if (!((A[i][j] >> bit1) & 1)) { ops.push_back('W'); A[i][j] ^= s; } } } else { for (int j = n - 1; j >= 0; --j) { moveTo(i, j); if (!((A[i][j] >> bit1) & 1)) { ops.push_back('W'); A[i][j] ^= s; } } } } // --- Phase2: bit1 を保持しつつ bit2 を 1 にする --- int bit2 = bit1 - 1; while (bit2 >= 0) { bool ok = false; rep(i, 0, n) rep(j, 0, n) { if ((A[i][j] >> bit2) & 1) { ok = true; break; } } if (ok) break; --bit2; } if (bit2 < 0) { rep(idx, 0, ops.size()) cout << ops[idx] << '\n'; return 0; } // 今回の目標 s: s ^ A[i][j] の結果が bit2 を含むケース bi = -1; bj = -1; bd = INT_MAX; rep(i, 0, n) rep(j, 0, n) { int cand = s ^ A[i][j]; if ((cand >> bit2) & 1) { int d = abs(i - cx) + abs(j - cy); if (d < bd) { bd = d; bi = i; bj = j; } } } moveTo(bi, bj); ops.push_back('C'); s ^= A[bi][bj]; // コピーで bit2 を取り込む moveTo(0, 0); rep(i, 0, n) { if (i % 2 == 0) { rep(j, 0, n) { moveTo(i, j); if (!((A[i][j] >> bit2) & 1)) { ops.push_back('W'); A[i][j] ^= s; } } } else { for (int j = n - 1; j >= 0; --j) { moveTo(i, j); if (!((A[i][j] >> bit2) & 1)) { ops.push_back('W'); A[i][j] ^= s; } } } } rep(idx, 0, ops.size()) cout << ops[idx] << '\n'; return 0; }