結果
問題 |
No.5022 XOR Printer
|
ユーザー |
![]() |
提出日時 | 2025-07-26 14:43:34 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,406 bytes |
コンパイル時間 | 3,988 ms |
コンパイル使用メモリ | 310,600 KB |
実行使用メモリ | 7,716 KB |
スコア | 4,447,588,841 |
最終ジャッジ日時 | 2025-07-26 14:43:40 |
合計ジャッジ時間 | 5,287 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll MAX_OP = 1000; ll N, T; vector<vector<ll>> grid; ll cnt = 0; ll x = 0, y = 0; ll s = 0; bool move(ll ex, ll ey) { ll dx = ex - x; ll dy = ey - y; if (cnt + abs(dx) + abs(dy) > MAX_OP) return false; while (dx != 0) { cout << (dx > 0 ? "R" : "L") << "\n"; x += (dx > 0 ? 1 : -1); dx += (dx > 0 ? -1 : 1); cnt++; } while (dy != 0) { cout << (dy > 0 ? "D" : "U") << "\n"; y += (dy > 0 ? 1 : -1); dy += (dy > 0 ? -1 : 1); cnt++; } return true; } bool copy() { if (cnt + 1 > MAX_OP) return false; s ^= grid[y][x]; cout << "C\n"; cnt++; return true; } bool write() { if (cnt + 1 > MAX_OP) return false; ll old_val = grid[y][x]; ll new_val = old_val ^ s; if (new_val > old_val) { grid[y][x] = new_val; cout << "W\n"; cnt++; } return true; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> T; grid.resize(N, vector<ll>(N)); for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) cin >> grid[i][j]; // 方針:高ビットを持つマスにsをコピーして、低ビットを持つマスにXORして書き換える vector<tuple<int, int, int>> cells; // {bitcount, y, x} for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) cells.emplace_back(__builtin_popcountll(grid[i][j]), i, j); // 高ビットから順に処理 sort(cells.rbegin(), cells.rend()); for (auto [bitc, sy, sx] : cells) { if (!move(sx, sy)) break; if (!copy()) break; // 近いマスを探索してXORした方が良くなるものを書き換える vector<tuple<ll, int, int>> delta_list; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { ll before = grid[i][j]; ll after = before ^ s; if (after > before) delta_list.emplace_back(after - before, i, j); } } // スコアの増加が大きい順に処理 sort(delta_list.rbegin(), delta_list.rend()); for (auto [delta, ty, tx] : delta_list) { if (!move(tx, ty)) goto END; if (!write()) goto END; } } END: return 0; }