結果
| 問題 |
No.5022 XOR Printer
|
| コンテスト | |
| ユーザー |
bird01
|
| 提出日時 | 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;
}
bird01