結果
| 問題 | 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;
}
            
            
            
        