結果
| 問題 |
No.5022 XOR Printer
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-26 15:34:13 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 10 ms / 2,000 ms |
| コード長 | 4,000 bytes |
| コンパイル時間 | 2,526 ms |
| コンパイル使用メモリ | 207,660 KB |
| 実行使用メモリ | 7,716 KB |
| スコア | 5,193,839,548 |
| 最終ジャッジ日時 | 2025-07-26 15:34:44 |
| 合計ジャッジ時間 | 4,694 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<long long, long long>;
#define rep(i, a, b) for(long long i = (a); i < (b); ++i)
#define rrep(i, a, b) for(long long i = (a); i >= (b); --i)
constexpr long long inf = 4e18;
struct SetupIO {
SetupIO() {
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed << setprecision(30);
}
} setup_io;
class TimeKeeper {
public:
// コンストラクタ:limitMillis に制限時間(ミリ秒)を指定
TimeKeeper(long long limitMillis)
: limitTime(limitMillis), startTime(std::chrono::steady_clock::now())
{
}
// インスタンス生成直後は経過時間は0ミリ秒とみなす
// 現在の経過時間(ミリ秒)を返す
long long getNowTime() const {
auto now = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - startTime);
return elapsed.count();
}
// 制限時間を超えているかを返す
bool isTimeOver() const {
return getNowTime() >= limitTime.count();
}
private:
std::chrono::steady_clock::time_point startTime; // 開始時間
std::chrono::milliseconds limitTime; // 制限時間(ミリ秒)
};
// 制限時間
int time_threshold = 1950;
// 変数
int n = 10, t = 1000;
vector<vector<int>> mass(n, vector<int>(n));
string ans;
int pos = 0;
int s = 0;
// 関数
void handle_input() {
cin >> n >> t;
rep(i, 0, n) rep(j, 0, n) cin >> mass[i][j];
}
string move(int from, int to) {
int from_i = from / n;
int from_j = from % n;
int to_i = to / n;
int to_j = to % n;
string res;
if(from_i < to_i) rep(i, 0, to_i-from_i) res.push_back('D');
if(from_i > to_i) rep(i, 0, from_i-to_i) res.push_back('U');
if(from_j < to_j) rep(i, 0, to_j-from_j) res.push_back('R');
if(from_j > to_j) rep(i, 0, from_j-to_j) res.push_back('L');
cerr << from_i << " " << from_j << " " << to_i << " " << to_j << endl;
cerr << res << endl;
return res;
}
void trial() {
vector<int> used;
rrep(bit, 19, 0) {
{
int dist = 1001001001;
int to = -1;
rep(i, 0, n) rep(j, 0, n) {
if(find(used.begin(), used.end(), i*n+j) == used.end() and ((mass[i][j]^s)>>bit) & 1 and dist > abs(i-pos/n) + abs(j-pos%n)) {
dist = abs(i-pos/n) + abs(j-pos%n);
to = i*n+j;
}
}
if(to == -1) continue;
ans.append(move(pos, to));
pos = to;
ans.append("C");
s = s ^ mass[to/n][to%n];
}
vector<int> dests;
int ok = 0;
rep(i, 0, n) rep(j, 0, n) {
int ni = (bit & 1) ? i : n-i-1;
int nj = (i & 1) ? n-j-1 : j;
cerr << nj << endl;
if(((mass[ni][nj]>>bit) & 1) == 0) {
dests.push_back(ni*n + nj);
if(find(used.begin(), used.end(), ni*n+nj) == used.end()) ok = dests.size()-1;
}
// cerr << ((mass[i][j] >> bit) & 1) << endl;
}
swap(dests[dests.size()-1], dests[ok]);
rep(i, 0, dests.size()) {
int to = dests[i];
ans.append(move(pos, to));
pos = to;
if(i != dests.size()-1 or bit == 19) {
ans.append("W");
mass[to/n][to%n] = s ^ mass[to/n][to%n];
} else {
ans.append("C");
s ^= mass[to/n][to%n];
used.push_back(to);
}
}
if(ans.size() > t) break;
}
}
void answer() {
rep(i, 0, min(t, (int)ans.size())) cout << ans[i] << endl;
}
int main(void) {
auto time_keeper = TimeKeeper(time_threshold);
handle_input();
while(1) {
if (time_keeper.isTimeOver()) {
break;
}
trial();
break;
}
answer();
}