結果
問題 |
No.5022 XOR Printer
|
ユーザー |
|
提出日時 | 2025-07-26 14:50:30 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 2,554 bytes |
コンパイル時間 | 3,142 ms |
コンパイル使用メモリ | 285,468 KB |
実行使用メモリ | 7,720 KB |
スコア | 3,917,045,461 |
最終ジャッジ日時 | 2025-07-26 14:50:36 |
合計ジャッジ時間 | 5,398 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
#include <bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); // 盤面サイズ N と操作上限 T を読み込む int N, T; cin >> N >> T; // この入力を忘れるとずれて読み込まれます // 盤面を読み込む vector<vector<uint32_t>> A(N, vector<uint32_t>(N)); for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ cin >> A[i][j]; } } // 1) 盤面内の最大値を求める uint32_t maxVal = 0; for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ maxVal = max(maxVal, A[i][j]); } } // 2) 最大値セルのうち (0,0) からのマンハッタン距離が最小のセルを選ぶ int im = 0, jm = 0; int minDist = INT_MAX; for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ if(A[i][j] == maxVal){ int d = i + j; // (0,0) からの距離 if(d < minDist){ minDist = d; im = i; jm = j; } } } } // 3) 操作シーケンスと現在位置を用意 vector<char> ops; int x = 0, y = 0; // 現在位置 (行,列) // (x,y) -> (tx,ty) へ移動するヘルパー auto move_to = [&](int tx, int ty){ while(x < tx){ ops.push_back('D'); x++; } while(x > tx){ ops.push_back('U'); x--; } while(y < ty){ ops.push_back('R'); y++; } while(y > ty){ ops.push_back('L'); y--; } }; // 4) 最大値セルへ移動して C 操作 move_to(im, jm); ops.push_back('C'); uint32_t s = A[im][jm]; // 手元のコピー値 // 5) スタート (0,0) へ戻る move_to(0, 0); // 6) 蛇行走査で全セルを訪問し、XOR 後のほうが大きければ W 操作 for(int i = 0; i < N; i++){ if(i % 2 == 0){ // 偶数行は左→右 for(int j = 0; j < N; j++){ if(i != 0 || j != 0) move_to(i, j); uint32_t v0 = A[i][j], v1 = v0 ^ s; if(v1 > v0) ops.push_back('W'); } } else { // 奇数行は右→左 for(int j = N - 1; j >= 0; j--){ move_to(i, j); uint32_t v0 = A[i][j], v1 = v0 ^ s; if(v1 > v0) ops.push_back('W'); } } } // 7) 出力 (1 行に 1 操作ずつ) for(char c : ops){ cout << c << "\n"; } return 0; }