結果
| 問題 |
No.5022 XOR Printer
|
| コンテスト | |
| ユーザー |
yimiya(いみや)
|
| 提出日時 | 2025-07-26 14:43:34 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 2,406 bytes |
| コンパイル時間 | 3,988 ms |
| コンパイル使用メモリ | 310,600 KB |
| 実行使用メモリ | 7,716 KB |
| スコア | 4,447,588,841 |
| 最終ジャッジ日時 | 2025-07-26 14:43:40 |
| 合計ジャッジ時間 | 5,287 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAX_OP = 1000;
ll N, T;
vector<vector<ll>> grid;
ll cnt = 0;
ll x = 0, y = 0;
ll s = 0;
bool move(ll ex, ll ey) {
ll dx = ex - x;
ll dy = ey - y;
if (cnt + abs(dx) + abs(dy) > MAX_OP) return false;
while (dx != 0) {
cout << (dx > 0 ? "R" : "L") << "\n";
x += (dx > 0 ? 1 : -1);
dx += (dx > 0 ? -1 : 1);
cnt++;
}
while (dy != 0) {
cout << (dy > 0 ? "D" : "U") << "\n";
y += (dy > 0 ? 1 : -1);
dy += (dy > 0 ? -1 : 1);
cnt++;
}
return true;
}
bool copy() {
if (cnt + 1 > MAX_OP) return false;
s ^= grid[y][x];
cout << "C\n";
cnt++;
return true;
}
bool write() {
if (cnt + 1 > MAX_OP) return false;
ll old_val = grid[y][x];
ll new_val = old_val ^ s;
if (new_val > old_val) {
grid[y][x] = new_val;
cout << "W\n";
cnt++;
}
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N >> T;
grid.resize(N, vector<ll>(N));
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
cin >> grid[i][j];
// 方針:高ビットを持つマスにsをコピーして、低ビットを持つマスにXORして書き換える
vector<tuple<int, int, int>> cells; // {bitcount, y, x}
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
cells.emplace_back(__builtin_popcountll(grid[i][j]), i, j);
// 高ビットから順に処理
sort(cells.rbegin(), cells.rend());
for (auto [bitc, sy, sx] : cells) {
if (!move(sx, sy)) break;
if (!copy()) break;
// 近いマスを探索してXORした方が良くなるものを書き換える
vector<tuple<ll, int, int>> delta_list;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
ll before = grid[i][j];
ll after = before ^ s;
if (after > before)
delta_list.emplace_back(after - before, i, j);
}
}
// スコアの増加が大きい順に処理
sort(delta_list.rbegin(), delta_list.rend());
for (auto [delta, ty, tx] : delta_list) {
if (!move(tx, ty)) goto END;
if (!write()) goto END;
}
}
END:
return 0;
}
yimiya(いみや)