// ceoi16p1 - ICC
#include <bits/stdc++.h>
#include "icc.h"
using namespace std;
struct DSU{
int n;
vector<int> p,sz;
DSU(){};
DSU(int n): n(n), p(n+1, 0), sz(n+1, 1){
for(int i=1;i<=n;i++) p[i] = i;
}
int find_set(int u){
return (u == p[u] ? u : p[u] = find_set(p[u]));
}
void union_set(int u, int v){
u = find_set(u);
v = find_set(v);
if(u == v) return;
if(sz[u] < sz[v]) swap(u, v);
p[v] = u;
sz[u] += sz[v];
}
};
void run(int N){
DSU dsu = DSU(N);
mt19937 rng(128379878);
for(int eee=1;eee<N;eee++){
int sza, szb, a[N], b[N];
vector<int> col(N+1, 0);
vector<int> comp;
for(int i=1;i<=N;i++){
if(dsu.find_set(i) == i){
comp.push_back(i);
}
}
shuffle(comp.begin(), comp.end(), rng);
for(int j=0;j<=7;j++){
for(int i=0;i<comp.size();i++){
col[comp[i]] = i >> j & 1;
}
sza = 0; szb = 0;
for(int i=1;i<=N;i++){
if(col[dsu.find_set(i)]){
b[szb++] = i;
}else{
a[sza++] = i;
}
}
if(query(sza, szb, a, b)) break;
}
int L = 1, R = sza;
while(L <= R){
int mid = (L + R) / 2;
if(query(mid, szb, a, b)) R = mid - 1;
else L = mid + 1;
}
int u = a[L-1];
L = 1; R = szb;
while(L <= R){
int mid = (L + R) / 2;
if(query(sza, mid, a, b)) R = mid - 1;
else L = mid + 1;
}
int v = b[L-1];
dsu.union_set(u, v);
setRoad(u, v);
}
}
#ifdef LOCAL
int main(){
run(StartLocalTest());
cout << "query() called " << QUERY_CALL << " times\n";
}
#endif // LOCAL
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |