結果
問題 |
No.5022 XOR Printer
|
ユーザー |
|
提出日時 | 2025-07-26 13:38:28 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 3,645 bytes |
コンパイル時間 | 2,046 ms |
コンパイル使用メモリ | 195,616 KB |
実行使用メモリ | 7,720 KB |
スコア | 1,297,111,346 |
最終ジャッジ日時 | 2025-07-26 13:38:33 |
合計ジャッジ時間 | 4,873 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
#include <iostream> #include <vector> #include <algorithm> #include <unordered_set> #include <utility> #include <climits> #include <deque> #include <bitset> #include <cmath> #include <cassert> #include <chrono> using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define ll long long #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") class Random { static uint32_t xorshift() { static uint32_t x = 123456789, y = 362436039, z = 521288629, w = 88675123; uint32_t t = x ^ (x << 11); x = y; y = z; z = w; return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); } public: // [0, x) inline static uint32_t randrange(unsigned x) { return xorshift() % x; } // [x, y) inline static uint32_t randrange(unsigned x, unsigned y) { return randrange(y - x) + x; } // [0.0, 1.0) inline static double random() { return (xorshift() + 0.5) * (1.0 / UINT_MAX); } }; const int N = 10; const int T = 1000; int A[N][N]; struct Data { int board[N][N]; short idx = 0; int score = 0; char ans[T]; int x = 0, y = 0, s = 0; Data() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { board[i][j] = A[i][j]; } } } int get_score() { int score = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { score += board[i][j]; } } return score; } // 現在地から (ti, tj) へ移動する void move(int ti, int tj) { if (x < ti) { for (int i = x; i < ti; i++) ans[idx++] = 'D'; } else { for (int i = x; i > ti; i--) ans[idx++] = 'U'; } if (y < tj) { for (int j = y; j < tj; j++) ans[idx++] = 'R'; } else { for (int j = y; j > tj; j--) ans[idx++] = 'L'; } x = ti, y = tj; } // コピーコマンドの実行 void copy() { ans[idx++] = 'C'; s ^= board[x][y]; } // 書き込みコマンドの実行 void write() { ans[idx++] = 'W'; board[x][y] ^= s; } }; // 盤面の数字の上から i 桁目を 1 にする void set_bit(Data & data, int i) { // いまの s の下から i bit 目が 1 じゃないなら、 // 現在地から最も近い 1 の bit を探して移動する if ((data.s & (1 << i)) == 0) { int min_dist = INT_MAX; int target_x = -1, target_y = -1; for (int x = 0; x < N; x++) { for (int y = 0; y < N; y++) { if (data.board[x][y] & (1 << i)) { int dist = abs(data.x - x) + abs(data.y - y); if (dist < min_dist) { min_dist = dist; target_x = x; target_y = y; } } } } // 移動して、s の i bit 目を 1 にする data.move(target_x, target_y); data.copy(); } if (data.s & (1 << i) == 0) return; // もし 1 のマスがないなら return // s の i bit 目が 0 のマスをすべて訪問して 1 にする // とりあえず適当な順番で訪問する for (int x = 0; x < N; x++) { for (int y = 0; y < N; y++) { if (data.board[x][y] & (1 << i)) { data.move(x, y); data.write(); } } } } Data solve() { Data data; for (int i = 19; i < 20; i++) { set_bit(data, i); } cerr << "score: " << data.get_score() << endl; return data; } int main() { // 入力 int _n, _t; cin >> _n >> _t; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cin >> A[i][j]; } } Data ans = solve(); // 出力 for (int i = 0; i < ans.idx; i++) { cout << ans.ans[i] << "\n"; } return 0; }