Submission #1051574

#TimeUsernameProblemLanguageResultExecution timeMemory
1051574Gromp15Comparing Plants (IOI20_plants)C++17
25 / 100
4037 ms8076 KiB
#include <bits/stdc++.h> #include "plants.h" #define all(x) x.begin(), x.end() #define sz(x) (int)x.size() using namespace std; int n, k; vector<int> got; vector<int> r; vector<vector<bool>> can; void init(int _k, std::vector<int> _r) { k = _k; r = _r; n = sz(r); if (2 * k > n) { got.resize(n); vector<bool> vis(n); for (int i = 0; i < n; i++) { vector<int> good; for (int j = 0; j < n; j++) if (!r[j] && !vis[j]) { bool ok = 1; for (int z = 1; z < k; z++) { int idx = j - z; if (idx < 0) idx += n; if (!vis[idx] && !r[idx]) { ok = 0; break; } } if (ok) { good.emplace_back(j); } } if (good.empty()) break; for (int v : good) vis[v] = 1; assert(good.size() == 1); for (int c : good) { got[c] = n - i; for (int j = 1; j < k; j++) { int idx = c - j; if (idx < 0) idx += n; r[idx]--; } } } r = _r; return; } if (n <= 300) { can.resize(n, vector<bool>(n)); for (int t = 0; t < n; t++) { r = _r; vector<bool> vis(n); for (int i = 0; i < n; i++) { vector<int> good; for (int j = 0; j < n; j++) if (!r[j] && !vis[j]) { bool ok = 1; for (int z = 1; z < k; z++) { int idx = j - z; if (idx < 0) idx += n; if (!vis[idx] && !r[idx]) { ok = 0; break; } } if (ok) { good.emplace_back(j); } } if (find(all(good), t) != good.end()) good.erase(find(all(good), t)); if (good.empty()) break; for (int v : good) vis[v] = 1; for (int c : good) { for (int j = 1; j < k; j++) { int idx = c - j; if (idx < 0) idx += n; r[idx]--; } } } for (int i = 0; i < n; i++) can[t][i] = vis[i]; } } } bool win(int x, int y) { // can x be used before y if (2 * k > n) { int d = (x - y + n) % n; if (d < k && !r[y]) return 0; return got[x] > got[y]; } return can[y][x]; } int compare_plants(int x, int y) { int w1 = win(x, y), w2 = win(y, x); assert(w1 || w2); return w1 && w2 ? 0 : w1 ? 1 : -1; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...