Submission #1244554

#TimeUsernameProblemLanguageResultExecution timeMemory
1244554fskaricaICC (CEOI16_icc)C++20
0 / 100
1 ms584 KiB
#include <bits/stdc++.h> #include "icc.h" using namespace std; #define ll long long #define fi first #define se second #define pii pair<int, int> const int MAX = 110; int n; int parent[MAX]; int depth[MAX]; vector <int> v[MAX]; vector <int> groups; int find(int a) { if (a == parent[a]) return a; return parent[a] = find(parent[a]); } void spoji(int a, int b) { setRoad(a, b); a = find(a); b = find(b); if (a == b) return; if (depth[a] >= depth[b]) { depth[a] += depth[b]; parent[b] = a; for (auto e : v[b]) v[a].push_back(e); } else { depth[b] += depth[a]; parent[a] = b; for (auto e : v[a]) v[b].push_back(e); } } int sendQuery(vector <int> a, vector <int> b) { if (a.empty()) return 0; if (b.empty()) return 0; int sza = a.size(); int szb = b.size(); int arra[sza]; int arrb[szb]; for (int i = 0; i < sza; i++) arra[i] = a[i]; for (int i = 0; i < szb; i++) arrb[i] = b[i]; return query(sza, szb, arra, arrb); } void rek(vector <int> g, vector <int> g2, int o); void nadiUnutarGrupe(int g, int g2) { vector <int> a, b; for (int i = 1; i <= n; i++) { if (find(i) == g) a.push_back(i); if (find(i) == g2) b.push_back(i); } rek(a, b, 2); } void rek(vector <int> g, vector <int> g2, int o) { if (g.empty() || g2.empty()) return; if (g.size() == 1 && g2.size() == 1) { if (o == 1) nadiUnutarGrupe(g[0], g2[0]); else spoji(g[0], g2[0]); return; } vector <int> gpola, gpola2, g2pola, g2pola2; for (int i = 0; i < (int)g.size(); i++) { if (i < g.size() / 2) gpola.push_back(g[i]); else gpola2.push_back(g[i]); } for (int i = 0; i < (int)g2.size(); i++) { if (i < g2.size() / 2) g2pola.push_back(g2[i]); else g2pola2.push_back(g2[i]); } if (sendQuery(gpola, g2)) { if (sendQuery(gpola, g2pola)) rek(gpola, g2pola, o); else rek(gpola, g2pola2, o); } else { if (sendQuery(gpola2, g2pola)) rek(gpola2, g2pola, o); else rek(g2pola, g2pola2, o); } } void solve() { vector <int> g, g2; int bit = 0; while (true) { g.clear(), g2.clear(); for (int i = 0; i < (int)groups.size(); i++) { if (i & (1 << bit)) g.push_back(groups[i]); else g2.push_back(groups[i]); } if (sendQuery(g, g2)) break; bit++; } rek(g, g2, 1); } void run(int N) { n = N; for (int i = 1; i <= n; i++) { parent[i] = i; depth[i] = 1; v[i].push_back(i); } for (int i = 1; i < n; i++) { groups.clear(); for (int j = 1; j <= n; j++) if (find(j) == j) groups.push_back(j); solve(); } }
#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...