結果
| 問題 | No.5022 XOR Printer |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-06-17 13:51:12 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 2,862 bytes |
| 記録 | |
| コンパイル時間 | 1,046 ms |
| コンパイル使用メモリ | 114,912 KB |
| 実行使用メモリ | 6,400 KB |
| スコア | 4,490,553,417 |
| 最終ジャッジ日時 | 2026-06-17 13:51:17 |
| 合計ジャッジ時間 | 3,970 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge2_0 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
int N, T;
vector<vector<long long>> A;
int curr_r = 0, curr_c = 0;
long long s = 0;
string ops = "";
void move_to(int tr, int tc) {
while (curr_r < tr && ops.length() < T) { ops += "D"; curr_r++; }
while (curr_r > tr && ops.length() < T) { ops += "U"; curr_r--; }
while (curr_c < tc && ops.length() < T) { ops += "R"; curr_c++; }
while (curr_c > tc && ops.length() < T) { ops += "L"; curr_c--; }
}
// ジグザグ順で次に進むべき座標を取得する関数
pair<int, int> get_next_zigzag(int r, int c) {
// 現在の進む方向を判定(偶数行は右、奇数行は左)
if (r % 2 == 0) {
if (c + 1 < N) return {r, c + 1};
else return {r + 1, c};
} else {
if (c - 1 >= 0) return {r, c - 1};
else return {r + 1, c};
}
}
int main() {
if (!(cin >> N >> T)) return 0;
A.assign(N, vector<long long>(N));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) cin >> A[i][j];
}
for (int bit = 19; bit >= 0; --bit) {
if (ops.length() >= T) break;
// 1. sを更新する (C)
bool s_updated = false;
if (((s >> bit) & 1) == 0) {
// 最も近い「対象ビットが1になるマス」を探して移動し、C
int best_r = -1, best_c = -1;
int min_dist = 10000;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if ((((s ^ A[i][j]) >> bit) & 1) == 1) {
int d = abs(curr_r - i) + abs(curr_c - j);
if (d < min_dist) { min_dist = d; best_r = i; best_c = j; }
}
}
}
if (best_r != -1) {
move_to(best_r, best_c);
if (ops.length() < T) { ops += "C"; s ^= A[curr_r][curr_c]; s_updated = true; }
}
}
// 2. pへ移動する
// bitが奇数なら(0,0)、偶数なら(N-1,N-1)
int pr = (bit % 2 != 0) ? 0 : N - 1;
int pc = (bit % 2 != 0) ? 0 : N - 1;
move_to(pr, pc);
// 3. ジグザグに行動 (W)
int r = curr_r, c = curr_c;
while (ops.length() < T) {
if (((A[r][c] >> bit) & 1) == 0) {
if ((A[r][c] ^ s) > A[r][c]) {
// ここでW
ops += "W"; A[r][c] ^= s;
}
}
// 次のマスへ
if (r == N - 1 && ( (r%2==0 && c==N-1) || (r%2!=0 && c==0) )) break;
pair<int, int> next = get_next_zigzag(r, c);
move_to(next.first, next.second);
r = curr_r; c = curr_c;
}
}
for(char c : ops){
cout << c << endl;
}
return 0;
}