Submission #374638

#TimeUsernameProblemLanguageResultExecution timeMemory
374638mohamedsobhi777Library (JOI18_library)C++14
0 / 100
36 ms364 KiB
#include <bits/stdc++.h> #include <vector> #include "library.h" using namespace std; #define vi vector<int> #define pb push_back int n; struct sub { vi a; sub(int x) { a = {x}; } sub() {} }; vector<sub> ar; int query(vi x) { vi ret(n, 0); for (auto u : x) ret[u] = 1; return Query(ret); } bool belong(sub x, int y) { x.a.pb(y); return query(x.a) == 1; } bool belong2(sub x, int y) { int z = query(x.a); x.a.pb(y); return query(x.a) == z; } bool direction(sub x, int u) { vi tmp; tmp.pb(x.a.back()); tmp.pb(u); return query(tmp) == 1; } void merge(sub &x, int y) { if (direction(x, y) == 1) { x.a.pb(y); } else { vi add = {y}; x.a.insert(x.a.begin(), add.begin(), add.end()); } } int get(int lo, int hi, int i) { int ans = 0; while (lo <= hi) { int mid = (lo + hi) >> 1; vi qu(n, 0); for (int j = lo; j <= mid; ++j) { for (auto u : ar[j].a) qu[u] = 1; } int ask1 = Query(qu); qu[i] = 1; if (Query(qu) == ask1) { ans = mid; hi = mid - 1; } else lo = mid + 1; } return ans; } void Solve(int N) { n = N; vi tmp(N, 0); int comp = 0; for (int i = 0; i < N; ++i) { tmp[i] = 1; int y = Query(tmp); if (y == comp + 1) ar.pb(sub(i)); else if (y == comp) merge(ar[get(0, (int)ar.size() - 1, i)], i); else { int lo = 0, hi = (int)ar.size() - 2; int ans = 0; while (lo <= hi) { int mid = (lo + hi) >> 1; sub lhs, rhs; bool bl = 0, br = 0; for (int j = 0; j < (int)ar.size(); ++j) { if (j <= mid) lhs.a.insert(lhs.a.end(), ar[j].a.begin(), ar[j].a.end()); else rhs.a.insert(rhs.a.end(), ar[j].a.begin(), ar[j].a.end()); } bl = belong2(lhs, i); br = belong2(rhs, i); if (bl && br) { ans = mid; break; } if (bl) hi = mid - 1; else lo = mid + 1; } vi nei = {get(0, ans, i), get(ans + 1, (int)ar.size() - 1, i)}; sub ret; if (!direction(ar[nei[0]], i)) reverse(ar[nei[0]].a.begin(), ar[nei[0]].a.end()); if (direction(ar[nei[1]], i)) reverse(ar[nei[1]].a.begin(), ar[nei[1]].a.end()); ret.a.insert(ret.a.end(), ar[nei[0]].a.begin(), ar[nei[0]].a.end()); ret.a.pb(i); ret.a.insert(ret.a.end(), ar[nei[1]].a.begin(), ar[nei[1]].a.end()); vector<sub> nar; for (int j = 0; j < (int)ar.size(); ++j) { if (j == nei[0] || j == nei[1]) continue; nar.pb(ar[j]); } nar.pb(ret); ar = nar; } comp = y; } // for (auto u : ar) // { // for (auto v : u.a) // cout << ++v << " "; // cout << "\n"; // } // srand(time(0)) ; // int arr[1000] ; // iota(arr , arr + 1000 , 1) ; // random_shuffle(arr , arr + 1000) ; // for(int i = 0 ;i < 1000 ;++ i)cout<< arr[i] <<" " ; // return ; // for(auto u : ar[0].a)cout<< u <<" " ; for (auto &u : ar[0].a) ++u; Answer(ar[0].a); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...