Submission #873210

#TimeUsernameProblemLanguageResultExecution timeMemory
873210rainboyShuffle (NOI19_shuffle)C++17
48 / 100
2 ms2652 KiB
#include "shuffle.h" #include <cstring> #include <vector> using namespace std; const int N = 1000, L = 10; /* L = ceil(log2(N)) */ typedef vector<int> vi; typedef vector<vi> vvi; int pp[L], xx[N], idx[N * N], xx_[N]; int uu[N], vv[N]; vi solve(int n, int m, int k, int q, int s) { vvi iii(m), aaa; vi aa(n); if (s == 3) { int l = 0, p = 1; while (p < n) pp[l++] = p, p *= m; for (int i = 0; i < n; i++) { int d = i % m, x = d; for (int h = 1; h < l; h++) { int d_ = (i / pp[h] + d) % m; x += d_ * pp[h]; } idx[xx[i] = x] = i; } memset(xx_, 0, n * sizeof *xx_); for (int h = 0; h < l; h++) { for (int d = 0; d < m; d++) iii[d].clear(); for (int i = 0; i < n; i++) iii[xx[i] / pp[h] % m].push_back(i + 1); aaa = shuffle(iii); for (int d = 0; d < m; d++) for (int g = 0; g < k; g++) xx_[aaa[d][g] - 1] += d * pp[h]; } for (int a = 0; a < n; a++) aa[idx[xx_[a]]] = a + 1; } else if (s == 2 || s == 4) { for (int d = 0; d < n / 2; d++) iii[d].clear(); for (int d = 0; d < n / 2; d++) iii[d] = { d * 2 + 1, d * 2 + 2 }; aaa = shuffle(iii); for (int d = 0; d < n / 2; d++) { int a = aaa[d][0] - 1, b = aaa[d][1] - 1; uu[a] = b, uu[b] = a; } for (int d = 0; d + 1 < n / 2; d++) iii[d] = { d * 2 + 2, d * 2 + 3 }; iii[n / 2 - 1] = { n, 1 }; aaa = shuffle(iii); for (int d = 0; d < n / 2; d++) { int a = aaa[d][0] - 1, b = aaa[d][1] - 1; vv[a] = b, vv[b] = a; } for (int i = 2, j = n - 1; j - i > 3; i++, j--) iii[i - 2] = { i + 1, j + 1 }; iii[n / 2 - 3] = { n / 2, n / 2 + 2 }, iii[n / 2 - 2] = { n / 2 + 1, n / 2 + 3 }; iii[n / 2 - 1] = { 1, 2 }; aaa = shuffle(iii); int a_ = -1, b_ = -1; for (int d = 0; d < n / 2; d++) { int a = aaa[d][0] - 1, b = aaa[d][1] - 1; if (uu[a] == b) { a_ = a, b_ = b; break; } } for (int i = 1, j = n - 2; j - i > 3; i++, j--) iii[i - 1] = { i + 1, j + 1 }; iii[n / 2 - 3] = { n / 2 - 1, n / 2 + 1 }, iii[n / 2 - 2] = { n / 2, n / 2 + 2 }; iii[n / 2 - 1] = { n, 1 }; aaa = shuffle(iii); for (int d = 0; d < n / 2; d++) { int a = aaa[d][0] - 1, b = aaa[d][1] - 1; if (vv[a] == b) { if (b_ == a || b_ == b) a_ = b_; break; } } for (int i = 0, a = a_; i < n; i++) { aa[i] = a + 1; a = i % 2 == 0 ? uu[a] : vv[a]; } } else if (s == 1 || s == 5) { int l = 0; while (1 << l < n) l++; l++; for (int i = 0; i < n; i++) { int x = (i < n - 2 ? i : 1 << l - 1 ^ i & 1) ^ ((i & 1) == 0 ? 0 : (1 << l) - 2); idx[xx[i] = x] = i; } memset(xx_, 0, n * sizeof *xx_); for (int h = 0; h < l; h++) { for (int d = 0; d < 2; d++) iii[d].clear(); for (int i = 0; i < n; i++) iii[xx[i] >> h & 1].push_back(i + 1); aaa = shuffle(iii); for (int g = 0; g < n / 2; g++) xx_[aaa[1][g] - 1] ^= 1 << h; } for (int h = 1; h < l; h++) { int d = 0; for (int a = 0; a < n; a++) d += (xx_[a] >> h & 1) == (xx_[a] & 1) ? 1 : -1; if (d < 0) for (int a = 0; a < n; a++) xx_[a] ^= 1 << h; } for (int d = 0; d < 2; d++) iii[d].clear(); iii[0].push_back(1); for (int i = 2; i <= n / 2; i++) iii[0].push_back(i + 1); iii[1].push_back(2); for (int i = n / 2 + 1; i < n; i++) iii[1].push_back(i + 1); aaa = shuffle(iii); for (int d = 0; d < 2; d++) for (int g = 0; g < n / 2; g++) if (xx_[aaa[d][g] - 1] == 0) { int flip = 1; for (g = 0; g < n / 2; g++) if (xx_[aaa[d][g] - 1] == 2) { flip = 0; break; } if (flip) for (int a = 0; a < n; a++) xx_[a] ^= (1 << l) - 1; goto out; } out: for (int a = 0; a < n; a++) aa[idx[xx_[a]]] = a + 1; } return aa; }

Compilation message (stderr)

shuffle.cpp: In function 'vi solve(int, int, int, int, int)':
shuffle.cpp:97:36: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   97 |    int x = (i < n - 2 ? i : 1 << l - 1 ^ i & 1) ^ ((i & 1) == 0 ? 0 : (1 << l) - 2);
      |                                  ~~^~~
shuffle.cpp:97:44: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
   97 |    int x = (i < n - 2 ? i : 1 << l - 1 ^ i & 1) ^ ((i & 1) == 0 ? 0 : (1 << l) - 2);
      |                                          ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...