結果
問題 | No.5006 Hidden Maze |
ユーザー | wanui |
提出日時 | 2022-06-12 16:47:30 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 6,681 bytes |
コンパイル時間 | 2,491 ms |
実行使用メモリ | 22,900 KB |
スコア | 39,341 |
平均クエリ数 | 607.12 |
最終ジャッジ日時 | 2022-06-12 16:47:46 |
合計ジャッジ時間 | 15,154 ms |
ジャッジサーバーID (参考情報) |
judge15 / judge12 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 88 ms
22,600 KB |
testcase_01 | AC | 80 ms
21,928 KB |
testcase_02 | AC | 26 ms
21,980 KB |
testcase_03 | WA | - |
testcase_04 | AC | 47 ms
21,940 KB |
testcase_05 | AC | 26 ms
22,624 KB |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | AC | 28 ms
21,768 KB |
testcase_09 | AC | 36 ms
21,904 KB |
testcase_10 | WA | - |
testcase_11 | AC | 38 ms
22,880 KB |
testcase_12 | WA | - |
testcase_13 | AC | 23 ms
21,928 KB |
testcase_14 | WA | - |
testcase_15 | AC | 24 ms
21,780 KB |
testcase_16 | AC | 24 ms
21,952 KB |
testcase_17 | AC | 21 ms
21,904 KB |
testcase_18 | AC | 88 ms
21,940 KB |
testcase_19 | AC | 28 ms
21,892 KB |
testcase_20 | WA | - |
testcase_21 | AC | 25 ms
21,792 KB |
testcase_22 | AC | 28 ms
22,608 KB |
testcase_23 | AC | 45 ms
22,600 KB |
testcase_24 | AC | 83 ms
21,940 KB |
testcase_25 | AC | 48 ms
22,600 KB |
testcase_26 | AC | 83 ms
22,620 KB |
testcase_27 | AC | 24 ms
21,780 KB |
testcase_28 | AC | 21 ms
21,756 KB |
testcase_29 | AC | 58 ms
22,204 KB |
testcase_30 | WA | - |
testcase_31 | AC | 21 ms
21,940 KB |
testcase_32 | WA | - |
testcase_33 | AC | 28 ms
21,768 KB |
testcase_34 | AC | 27 ms
21,992 KB |
testcase_35 | AC | 28 ms
21,904 KB |
testcase_36 | AC | 28 ms
21,768 KB |
testcase_37 | AC | 83 ms
21,928 KB |
testcase_38 | AC | 61 ms
22,132 KB |
testcase_39 | AC | 25 ms
22,456 KB |
testcase_40 | AC | 28 ms
21,928 KB |
testcase_41 | WA | - |
testcase_42 | WA | - |
testcase_43 | WA | - |
testcase_44 | WA | - |
testcase_45 | WA | - |
testcase_46 | AC | 85 ms
21,908 KB |
testcase_47 | AC | 25 ms
22,204 KB |
testcase_48 | AC | 29 ms
21,768 KB |
testcase_49 | AC | 92 ms
21,768 KB |
testcase_50 | AC | 27 ms
22,600 KB |
testcase_51 | AC | 22 ms
22,252 KB |
testcase_52 | WA | - |
testcase_53 | WA | - |
testcase_54 | AC | 22 ms
22,264 KB |
testcase_55 | AC | 26 ms
21,992 KB |
testcase_56 | AC | 31 ms
22,004 KB |
testcase_57 | AC | 82 ms
21,940 KB |
testcase_58 | AC | 23 ms
22,216 KB |
testcase_59 | AC | 26 ms
21,768 KB |
testcase_60 | WA | - |
testcase_61 | AC | 22 ms
22,624 KB |
testcase_62 | WA | - |
testcase_63 | WA | - |
testcase_64 | WA | - |
testcase_65 | WA | - |
testcase_66 | AC | 26 ms
22,588 KB |
testcase_67 | AC | 27 ms
21,952 KB |
testcase_68 | AC | 89 ms
22,456 KB |
testcase_69 | AC | 27 ms
21,940 KB |
testcase_70 | AC | 23 ms
21,808 KB |
testcase_71 | AC | 25 ms
21,780 KB |
testcase_72 | AC | 21 ms
21,904 KB |
testcase_73 | WA | - |
testcase_74 | AC | 32 ms
21,892 KB |
testcase_75 | AC | 88 ms
22,564 KB |
testcase_76 | AC | 28 ms
22,620 KB |
testcase_77 | AC | 67 ms
21,820 KB |
testcase_78 | AC | 35 ms
22,576 KB |
testcase_79 | AC | 95 ms
21,768 KB |
testcase_80 | WA | - |
testcase_81 | WA | - |
testcase_82 | WA | - |
testcase_83 | AC | 22 ms
22,624 KB |
testcase_84 | AC | 30 ms
22,868 KB |
testcase_85 | WA | - |
testcase_86 | AC | 24 ms
22,468 KB |
testcase_87 | AC | 33 ms
21,928 KB |
testcase_88 | AC | 37 ms
22,240 KB |
testcase_89 | AC | 88 ms
21,892 KB |
testcase_90 | WA | - |
testcase_91 | WA | - |
testcase_92 | AC | 84 ms
21,940 KB |
testcase_93 | AC | 23 ms
22,564 KB |
testcase_94 | WA | - |
testcase_95 | AC | 82 ms
21,768 KB |
testcase_96 | AC | 20 ms
21,892 KB |
testcase_97 | AC | 86 ms
21,904 KB |
testcase_98 | AC | 41 ms
21,880 KB |
testcase_99 | AC | 25 ms
21,952 KB |
ソースコード
#include <bits/stdc++.h> // clang-format off using namespace std; using ll=long long; using ull=unsigned long long; using pll=pair<ll,ll>; const ll INF=4e18; void print0(){}; template<typename H,typename... T> void print0(H h,T... t){cout<<h;print0(t...);} void print(){print0("\n");}; template<typename H,typename... T>void print(H h,T... t){print0(h);if(sizeof...(T)>0)print0(" ");print(t...);} void perr0(){}; template<typename H,typename... T> void perr0(H h,T... t){cerr<<h;perr0(t...);} void perr(){perr0("\n");}; template<typename H,typename... T>void perr(H h,T... t){perr0(h);if(sizeof...(T)>0)perr0(" ");perr(t...);} void ioinit() { cout<<fixed<<setprecision(15); cerr<<fixed<<setprecision(6); ios_base::sync_with_stdio(0); cin.tie(0); } // clang-format on using pii = pair<int, int>; using tii = tuple<int, int, int>; struct point { int i; int j; }; bool operator==(const point &lhs, const point &rhs) { return (lhs.i == rhs.i && lhs.j == rhs.j); } bool operator!=(const point &lhs, const point &rhs) { return !(lhs == rhs); } bool operator<(const point &lhs, const point &rhs) { if (lhs.i != rhs.i) { return lhs.i < rhs.i; } return lhs.j < rhs.j; } std::ostream &operator<<(std::ostream &os, point &pt) { string s; s.push_back('('); s = s + to_string(pt.i); s = s + ", "; s = s + to_string(pt.j); s.push_back(')'); return os << s; } mt19937 engine(0); clock_t start_time; double now() { return 1000.0 * (clock() - start_time) / CLOCKS_PER_SEC; } void marathon_init() { start_time = clock(); random_device seed_gen; engine.seed(seed_gen()); } int randint(int mn, int mx) { int rng = mx - mn + 1; return mn + (engine() % rng); } double uniform(double x, double y) { const int RND = 1e8; double mean = (x + y) / 2.0; double dif = y - mean; double p = double(engine() % RND) / RND; return mean + dif * (1.0 - 2.0 * p); } bool anneal_accept(double new_score, double old_score, double cur_time, double begin_time, double end_time, double begin_temp, double end_temp) { const int ANNEAL_RND = 1e8; const double ANNEAL_EPS = 1e-6; double temp = cur_time * (end_temp - begin_temp) / (end_time - begin_time) + (end_time * begin_temp - end_temp * begin_time) / (end_time - begin_time); return (exp((new_score - old_score) / temp) > double(engine() % ANNEAL_RND) / ANNEAL_RND + ANNEAL_EPS); } const int N = 20; const int OPS = 1000; double P; const int R = 0; const int D = 1; const int L = 2; const int U = 3; vector<point> mvs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; int request(string ops) { cout << ops << endl; int res; cin >> res; return res; } string rand_combination(string s0, int start_ind) { string s = s0; int r = 0; int d = 0; for (int j = 0; j < start_ind; j++) { if (s[j] == 'R') r++; if (s[j] == 'D') d++; } for (int i = start_ind; i < int(s.size()); i++) { if (r < N - 1 && d < N - 1) { if (randint(0, 1)) { s[i] = 'R'; r++; } else { s[i] = 'D'; d++; } } else if (r < N - 1) { s[i] = 'R'; r++; } else { s[i] = 'D'; d++; } } return s; } string randrd(int length) { string s; for (int o = 0; o < length; o++) { if (randint(0, 1)) { s.push_back('R'); } else { s.push_back('D'); } } return s; } string makeop(int opid, vector<pair<int, string>> &history) { // とりあえず R と D だけ。それで到達できないケースは諦める。 int N2 = 2 * N - 2; // 全探索モード do { const int BRUTE_FORCE_START = 28; pair<int, string> maxhist = {0, ""}; for (auto h : history) { if (maxhist.first < h.first) { maxhist = h; } } if (maxhist.first < BRUTE_FORCE_START) { break; } unordered_set<string> hist_ops; for (auto h : history) { hist_ops.insert(h.second); } int baseind = maxhist.first + 1; int brute_force_num = N2 - baseind; int r0 = 0; int d0 = 0; { string s = maxhist.second; for (int j = 0; j < baseind; j++) { if (s[j] == 'R') r0++; if (s[j] == 'D') d0++; } } for (int i = 0; i < (1 << brute_force_num); i++) { string s = maxhist.second; int r = r0; int d = d0; for (int j = 0; j < brute_force_num; j++) { char c; if ((i >> j) & 1) { c = 'R'; r++; } else { c = 'D'; c++; } s[j + baseind] = c; } if (r > N - 1 || d > N - 1) continue; if (hist_ops.count(s)) continue; return s; } } while (0); // 完全な無作為 if (history.size() < 50 || opid % 10 == 0) { string s; s.resize(N2); return rand_combination(s, 0); } // 適当にサンプリング+改変 { pair<int, string> sample = history.back(); double total = 0; for (auto h : history) { total += (pow(1.0 * h.first, 2.0) + 0.5); } double rat = uniform(0.0, 1.0 * total); double cum = 0; for (auto h : history) { cum += (pow(1.0 * h.first, 2.0) + 0.5); if (rat < cum) { sample = h; break; } } if (sample.second.size() <= 1) { return randrd(N2); } // 後ろの方を適当に改変 string sample_str = sample.second; int sample_moves = sample.first; int sz = sample_str.size(); int changestart = sample_moves + randint(-2, 2); if (changestart < 0) changestart = 0; return rand_combination(sample_str, changestart); } return "R"; } void solve() { int opslimit = OPS; opslimit = 1000; int maxres = 0; vector<pair<int, string>> history; for (int opid = 0; opid < opslimit; opid++) { string s = makeop(opid, history); int res = request(s); if (res < 0) { return; } history.push_back({res, s}); maxres = max(maxres, res); } } int main() { marathon_init(); ioinit(); int _h, _w; cin >> _h >> _w >> P; P *= 0.01; solve(); return 0; }