Submission #129720

#TimeUsernameProblemLanguageResultExecution timeMemory
129720BTheroLibrary (JOI18_library)C++17
19 / 100
3084 ms472 KiB
// Why am I so dumb? :c // chrono::system_clock::now().time_since_epoch().count() //#pragma GCC optimize("Ofast") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> #include "library.h" #define pb push_back #define mp make_pair #define all(x) (x).begin(), (x).end() #define fi first #define se second using namespace std; using namespace __gnu_pbds; typedef long long ll; template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; const int MAXN = (int)1e3 + 5; vector<int> V[MAXN], S; int par[MAXN]; int getPar(int x) { if (x == par[x]) { return x; } else { return par[x] = getPar(par[x]); } } void uni(int a, int b) { a = getPar(a); b = getPar(b); if (a == b) { return; } par[b] = a; for (int x : V[b]) { V[a].pb(x); } V[b].clear(); int p = 0; while (S[p] != b) { ++p; } S.erase(S.begin() + p); } void Solve(int n) { vector<int> ask, p(n); for (int i = 0; i < n; ++i) { p[i] = i; } for (int step = 0; step < 10; ++step) { random_shuffle(all(p)); } for (int i = 0; i < n; ++i) { par[i] = i; V[i].pb(i); } S.pb(p[0]); int prev = 1; for (int i = 1; i < n; ++i) { ask = vector<int>(n, 0); for (int j = 0; j <= i; ++j) { ask[p[j]] = 1; } int cur = Query(ask); S.pb(p[i]); if (cur == prev) { for (int id : S) { if (id == p[i]) { continue; } ask = vector<int>(n, 0); ask[p[i]] = 1; ask[V[id].front()] = 1; if (Query(ask) == 1) { uni(p[i], id); break; } ask = vector<int>(n, 0); ask[p[i]] = 1; ask[V[id].back()] = 1; if (Query(ask) == 1) { uni(id, p[i]); break; } } } else if (cur == prev - 1) { int a = -1, b = -1; for (int id : S) { if (id == p[i]) { continue; } ask = vector<int>(n, 0); ask[p[i]] = 1; ask[V[id].front()] = 1; if (Query(ask) == 1) { if (b != -1) { reverse(all(V[id])); a = id; } else { b = id; } } else { ask = vector<int>(n, 0); ask[p[i]] = 1; ask[V[id].back()] = 1; if (Query(ask) == 1) { if (a != -1) { reverse(all(V[id])); b = id; } else { a = id; } } } } uni(a, p[i]); uni(a, b); } prev = cur; } int v = 0; while (getPar(v) != v) { ++v; } for (int &x : V[v]) { ++x; } Answer(V[v]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...