Submission #365390

#TimeUsernameProblemLanguageResultExecution timeMemory
365390MlxaMouse (info1cup19_mouse)C++14
81.69 / 100
227 ms1648 KiB
#ifdef LC #include "pch.h" #else #include <bits/stdc++.h> #endif using namespace std; #define all(x) x.begin(), x.end() #define x first #define y second #define mp make_pair #define mt make_tuple const int N = 1000; int n; int p[N]; int c[N][N]; bool b[N][N]; int bc[N]; int kn[N]; mt19937 rnd; int query(vector<int>); void block(int i, int j) { if (b[i][j]) { return; } b[i][j] = true; ++bc[i]; if (bc[i] == n - 1) { kn[i] = 1; while (b[i][kn[i]]) { ++kn[i]; } for (int ii = 0; ii < n; ++ii) { if (ii != i) { block(ii, kn[i]); } } } } bool bad(vector<int> q) { for (int i = 0; i < (int)q.size(); ++i) { if (q[i] == kn[i]) { return true; } } return false; } void solve(int _n) { n = _n; vector<int> q(n); iota(all(q), 1); for (int it = 1; ; ++it) { int cur = query(q); if (cur == n) { return; } if (cur > 2) { for (int i = 0; i < n; ++i) { c[i][q[i]] += cur; } } else if (!cur) { for (int i = 0; i < n; ++i) { block(i, q[i]); } } shuffle(all(q), rnd); while (bad(q)) { shuffle(all(q), rnd); } if (*min_element(bc, bc + n) == n - 1) { #ifdef LC cout << it << " queries" << endl; #endif q.assign(kn, kn + n); assert(query(q) == n); return; } } } #ifdef LC int query(vector<int> q) { int cnt = 0; for (int i = 0; i < (int)q.size(); ++i) { cnt += p[i] == q[i]; } return cnt; } signed main() { assert(freopen("input.txt", "r", stdin)); int _n; cin >> _n; for (int i = 0; i < _n; ++i) { cin >> p[i]; } solve(_n); return 0; } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...