#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#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){
int n1 = a.size(), n2 = b.size();
return query(n1, n2, &a[0], &b[0]);
}
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);
random_shuffle(begin(V), end(V));
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);
}
for (int i=1;i<n;i++)
solve(n);
}
// int main(){
// }
Compilation message
icc.cpp: In function 'void solve(int)':
icc.cpp:81:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
81 | if (p >= V.size())
| ~~^~~~~~~~~~~
icc.cpp:84:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
84 | for (int j=0, l = 0;j<V.size();j++){
| ~^~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
592 KB |
Ok! 106 queries used. |
2 |
Correct |
4 ms |
648 KB |
Ok! 101 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
25 ms |
592 KB |
Ok! 527 queries used. |
2 |
Correct |
24 ms |
592 KB |
Ok! 533 queries used. |
3 |
Correct |
23 ms |
760 KB |
Ok! 555 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
67 ms |
592 KB |
Ok! 1348 queries used. |
2 |
Correct |
71 ms |
692 KB |
Ok! 1282 queries used. |
3 |
Correct |
71 ms |
696 KB |
Ok! 1418 queries used. |
4 |
Correct |
85 ms |
592 KB |
Ok! 1361 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
72 ms |
688 KB |
Ok! 1335 queries used. |
2 |
Correct |
70 ms |
592 KB |
Ok! 1331 queries used. |
3 |
Correct |
80 ms |
592 KB |
Ok! 1394 queries used. |
4 |
Correct |
80 ms |
592 KB |
Ok! 1386 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
70 ms |
592 KB |
Ok! 1349 queries used. |
2 |
Correct |
75 ms |
592 KB |
Ok! 1391 queries used. |
3 |
Correct |
78 ms |
688 KB |
Ok! 1331 queries used. |
4 |
Correct |
71 ms |
760 KB |
Ok! 1367 queries used. |
5 |
Correct |
86 ms |
864 KB |
Ok! 1393 queries used. |
6 |
Correct |
70 ms |
688 KB |
Ok! 1355 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
71 ms |
592 KB |
Ok! 1356 queries used. |
2 |
Correct |
69 ms |
592 KB |
Ok! 1310 queries used. |