Submission #1186446

#TimeUsernameProblemLanguageResultExecution timeMemory
1186446sqrtxsunlightMagic Show (APIO24_show)C++17
100 / 100
6 ms636 KiB
#include <bits/stdc++.h> #include "Alice.h" using namespace std; int n = 5000, cnt_trans = 0, lgn = 61; long long Rand (int l, int r) { unsigned long long x = (rand () << 15) ^ rand (); return x % (r - l + 1) + l; } int log2 (int i) { int ans = 0; while (i) i /= 2, ans ++; return (-- ans); } vector <pair <int, int>> Alice() { srand (24022007); long long pbml = 0; for (int i = 0; i < lgn - 1; i ++) pbml ^= (Rand (0, 1) << i); cerr << pbml << '\n'; vector <pair <int, int>> tree_trans; for (int i = 1; i <= n; i ++) cnt_trans += log2 (i - 1); long long x = setN (n); x ^= pbml; long long bit61 = 0; for (int i = 0; i < lgn - 1; i ++) bit61 ^= ((x & (1LL << i)) > 0); x ^= (bit61 << 61); vector <int> arr (cnt_trans, 0); for (int i = 0; i < cnt_trans; i ++) arr[i] = i % lgn; for (int i = 0; i < cnt_trans; i ++) swap (arr[i], arr[Rand (0, i)]); string trans; int cur_pos = 0; for (int i = 2; i <= n; i ++) { int lg = floor (log2 (i - 1)), p = 0; for (int j = 0; j < lg; j ++) p += (((x & (1LL << arr[cur_pos ++])) > 0) << j); p ++; tree_trans.push_back (make_pair (p, i)); } return tree_trans; }
#include <bits/stdc++.h> #include "Bob.h" using namespace std; #ifndef PBML int n = 5000, cnt_trans = 0, lgn = 61; long long Rand (int l, int r) { unsigned long long x = (rand () << 15) ^ rand (); return x % (r - l + 1) + l; } int log2 (int i) { int ans = 0; while (i) i /= 2, ans ++; return (-- ans); } #endif // PBML long long Bob (vector <pair <int, int>> tree) { srand (24022007); long long pbml = 0; for (int i = 0; i < lgn - 1; i ++) pbml ^= (Rand (0, 1) << i); cerr << pbml << '\n'; for (int i = 1; i <= n; i ++) cnt_trans += log2 (i); vector <int> par (n + 1, -1); for (auto i: tree) par[i.second] = i.first; vector <int> arr (cnt_trans, 0); for (int i = 0; i < cnt_trans; i ++) arr[i] = i % lgn; for (int i = 0; i < cnt_trans; i ++) swap (arr[i], arr[Rand (0, i)]); vector <int> vote (lgn, 0); int cur_pos = 0; long long ans = 0; for (int i = 2; i <= n; i ++) { int lg = log2 (i - 1), p = 0; if (par[i] > 0) par[i] --; for (int j = 0; j < lg; j ++) { if (par[i] == -1) { cur_pos ++; continue; } if (par[i] & (1 << j)) vote[arr[cur_pos ++]] ++; else vote[arr[cur_pos ++]] --; } } int cnt = 0; for (int i = 0; i < lgn; i ++) if (vote[i] == 0) cnt ++; assert (cnt <= 1); for (int i = 0; i < lgn; i ++) if (vote[i] > 0) ans |= (1LL << i); if (vote[lgn - 1] == 0) return (ans ^ pbml); long long bit61 = (ans & (1LL << lgn)); ans ^= bit61; bit61 >>= lgn; for (int i = 0; i < lgn - 1; i ++) bit61 ^= ((ans & (1LL << i)) > 0); if (bit61) for (int i = 0; i < lgn - 1; i ++) if (vote[i] == 0) ans |= (1LL << i); return (ans ^ pbml); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...