結果
問題 |
No.5022 XOR Printer
|
ユーザー |
|
提出日時 | 2025-07-26 14:29:40 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 4 ms / 2,000 ms |
コード長 | 6,474 bytes |
コンパイル時間 | 4,075 ms |
コンパイル使用メモリ | 329,352 KB |
実行使用メモリ | 7,716 KB |
スコア | 4,998,236,120 |
最終ジャッジ日時 | 2025-07-26 14:29:53 |
合計ジャッジ時間 | 6,016 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge6 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
// (◕ᴗ◕✿) // #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i) #define srep(i, s, n) for (ll i = s; i < (n); ++i) #define len(x) ((int)(x).size()) #define all(x) (x).begin(), (x).end() using namespace std; template<typename T> using vc = vector<T>; template<typename T> using vv = vc<vc<T>>; using vi = vc<int>;using vvi = vv<int>; using vvvi = vv<vi>; using ll = long long;using vl = vc<ll>;using vvl = vv<ll>; using vvvl = vv<vl>; using ld = long double; using vld = vc<ld>; using vvld = vc<vld>; using vvvld = vc<vvld>; using uint = unsigned int; using ull = unsigned long long; const ld pi = 3.141592653589793; const int inf = 0x3f3f3f3f; const ll INF = 0x3f3f3f3f3f3f3f3f; // const ll mod = 1000000007; const ll mod = 998244353; #define debug(var) do{std::cout << #var << " : \n";view(var);}while(0) template<typename T> void view(T e){cout << e << endl;} template<typename T> void view(const vc<T>& v){for(const auto& e : v){ cout << e << " "; } cout << endl;} template<typename T> void view(const vv<T>& vv){ for(const auto& v : vv){ view(v); } } // #define DEBUG #ifdef DEBUG constexpr bool DEBUGMODE = true; #else constexpr bool DEBUGMODE = false; #endif ofstream wrt; string outputfile = "output.txt", inputfile = "input.txt"; unsigned int randxor(){ static unsigned int x = 123456789, y = 362436069, z = 521288629, w = 88675123; unsigned int t; t = (x ^ (x << 11)); x = y; y = z; z = w; return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); } int randint(int a, int b) {return(a + randxor() % (b - a));} struct Timer { public: Timer(int limit){ start = chrono::high_resolution_clock::now(); goal = start + chrono::milliseconds(limit); } inline double rate(){ return (chrono::high_resolution_clock::now() - start).count() / (double)(goal - start).count(); } inline int get_time(){return (chrono::high_resolution_clock::now() - start).count() / 1e6;} private: chrono::high_resolution_clock::time_point start; chrono::high_resolution_clock::time_point goal; }; ll hilbertorder(int x, int y, ll maxn) { ll rx, ry, d = 0; for (ll s = maxn >> 1; s; s >>= 1) { rx = (x & s)>0, ry = (y & s)>0; d += s * s * ((rx * 3) ^ ry); if (ry) continue; if (rx) { x = maxn - 1 - x; y = maxn - 1 - y; } swap(x, y); } return d; } double log_table[70000]; //variable constexpr int TIME_LIMIT = 2990; constexpr int N = 10; constexpr int M = 100; constexpr int T = 1000; array<int, M> A; vi topbit[20]; array<int, M> eval; struct Solver{ void input(){ if (DEBUGMODE){ ifstream in(inputfile); cin.rdbuf(in.rdbuf()); int a; cin >> a >> a; rep(i, M) cin >> A[i]; }else{ int a; cin >> a >> a; rep(i, M) cin >> A[i]; } } void init(){ double n = 1 / (double)(2 * 70000); for (int i = 0; i < 70000; i++) { log_table[i] = log(((double)i / 70000) + n); } rep(i, M) topbit[31 - __builtin_clz(A[i])].push_back(i); ll maxn = 1; while (maxn < N) maxn <<= 1; rep(i, M) eval[i] = hilbertorder(i / N, i % N, maxn); } pair<int, vvi> greedy(vi indexs){ int P = len(indexs); vi S(1, A[indexs[0]]); srep(i, 1, len(indexs)) S.push_back(S.back() ^ A[indexs[i]]); vvi paths(P); rep(i, P) paths[i].push_back(indexs[i]); int score = 0; vi cmbs(1 << P, 0); rep(i, 1 << P){ rep(j, P) if (i >> j & 1) cmbs[i] ^= S[j]; } vi mark(M, 0); rep(i, P) mark[indexs[i]] = i + 1; rep(i, M){ int mask = (1 << mark[i]) - 1; int best = -1, bestcmb = -1; rep(cmb, 1 << P) if ((mask & cmb) == 0 && (A[i] ^ cmbs[cmb]) > best){ best = A[i] ^ cmbs[cmb]; bestcmb = cmb; } rep(j, P) if (bestcmb >> j & 1) paths[j].push_back(i); score += best; // cout << bestcmb << ' '; // if (i % N == N - 1) cout << endl; } return {score, paths}; } void move(int s, int t){ if (DEBUGMODE){ while (s / N < t / N){ wrt << 'D' << endl; s += N; } while (s / N > t / N){ wrt << 'U' << endl; s -= N; } while (s % N < t % N){ wrt << 'R' << endl; s++; } while (s % N > t % N){ wrt << 'L' << endl; s--; } }else{ while (s / N < t / N){ cout << 'D' << endl; s += N; } while (s / N > t / N){ cout << 'U' << endl; s -= N; } while (s % N < t % N){ cout << 'R' << endl; s++; } while (s % N > t % N){ cout << 'L' << endl; s--; } } } void output(vvi path){ rep(p, len(path)){ int frst = path[p][0]; sort(all(path[p]), [&](auto i, auto j){ return eval[i] < eval[j];}); int id = 0; rep(i, len(path[p])) if (path[p][i] == frst){id = i; break;} rotate(path[p].begin(), path[p].begin() + id, path[p].end()); } int pos = 0; for (auto p : path){ rep(i, len(p)){ move(pos, p[i]); pos = p[i]; if (DEBUGMODE){ if (i == 0) wrt << 'C' << endl; else wrt << 'W' << endl; }else{ if (i == 0) cout << 'C' << endl; else cout << 'W' << endl; } } } } void run(){ Timer timer(TIME_LIMIT); input(); init(); vi indexs = {topbit[17][0], topbit[18][0], topbit[19][0], topbit[19][1]}; auto [score, ans] = greedy(indexs); // cout << score << endl; output(ans); } }; int main(){ wrt.open(outputfile, ios::out); ios_base::sync_with_stdio(false); cin.tie(nullptr); Solver solver; solver.run(); wrt.close(); return 0; }