# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1112871 | 2024-11-15T06:34:17 Z | Jawad_Akbar_JJ | ICC (CEOI16_icc) | C++17 | 0 ms | 0 KB |
#include <iostream> #include <vector> #include <set> #include "icc.h" using namespace std; set<int> rt; vector<int> Vec[105]; int Root[105], seen[105][105]; vector<int> get(vector<int> a){ vector<int> ans; for (int i : a) for (int j : Vec[i]) ans.push_back(j); return ans; } bool Query(vector<int> a,vector<int> b){ return query((int)a.size(), (int)b.size(), a, b); } void solve2(vector<int> lft, vector<int> rgt){ lft = get(lft); int l = 0, r = lft.size(); while (l + 1 < r){ int m = (l + r) / 2; vector<int> vec2; for (int i = l;i < m;i++) vec2.push_back(lft[i]); if (Query(vec2, get(rgt))) r = m; else l = m; } vector<int> v; for (int i : rgt) if (!seen[Root[lft[l]]][i]) v.push_back(i); rgt = get(v); int l2 = 0, r2 = rgt.size(); while (l2 + 1 < r2){ int m2 = (l2 + r2) / 2; vector<int> vec2; for (int i=l2;i<m2;i++) vec2.push_back(rgt[i]); if (Query({lft[l]}, vec2)) r2 = m2; else l2 = m2; } int A = lft[l], B = rgt[l2]; setRoad(A, B); A = Root[A], B = Root[B]; for (int i : Vec[B]) Root[i] = A, Vec[A].push_back(i); rt.erase(B); } void solve(int n){ for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) seen[i][j] = 0; vector<int> V; for (int i : rt) V.push_back(i); for (int p=(1<<20);p >= 1;p /= 2){ if (p >= V.size()) continue; vector<int> lft, rgt; for (int j=0, l = 0;j<V.size();j++){ if (j % p == 0) l = 1 - l; if (l) lft.push_back(V[j]); else rgt.push_back(V[j]); } if (Query(get(lft), get(rgt))){ solve2(lft, rgt); return ; } for (int i : lft) for (int j : rgt) seen[i][j] = seen[j][i] = 1; } } void run(int n){ for (int i=1;i<=n;i++){ Root[i] = i; Vec[i].push_back(i); rt.insert(i); } while (n--) solve(n); }