#include "chameleon.h"
#include<bits/stdc++.h>
using namespace std;
void Solve(int n){
if(n <= 50){
vector<vector<int>>pp(n << 1 | 1);
vector<bool>vis(n << 1 | 1, false);
for(int i = 1; i <= (n << 1); i++){
if(!vis[i]){
vector<int>p;
for(int j = 1; j <= (n << 1); j++){
if(i != j){
vector<int>v = {i, j};
if(Query(v) == 1){
p.emplace_back(j);
}
}
}
if(p.size() == 1){
Answer(i, p[0]);
vis[i] = vis[p[0]] = true;
}
else{
pp[i] = p;
}
}
}
vector<vector<int>>candidate(n << 1 | 1);
for(int i = 1; i <= (n << 1); i++){
if(!vis[i]){
vector<vector<int>>v = {{i, pp[i][0], pp[i][1]}, {i, pp[i][0], pp[i][2]}, {i, pp[i][1], pp[i][2]}};
if(Query(v[0]) == 1){
candidate[i] = vector<int>{pp[i][0], pp[i][1]};
}
else if(Query(v[1]) == 1){
candidate[i] = vector<int>{pp[i][0], pp[i][2]};
}
else{
candidate[i] = vector<int>{pp[i][1], pp[i][2]};
}
}
}
for(int i = 1; i <= (n << 1); i++){
if(!vis[i]){
for(int& j : candidate[i]){
if(!vis[j] && (candidate[j][0] == i || candidate[j][1] == i)){
Answer(i, j);
vis[i] = vis[j] = true;
break;
}
}
}
}
return;
}
vector<vector<pair<int, int>>>g(n << 1 | 1);
vector<int>color(n << 1 | 1);
function<void(int)>dfs;
dfs = [&] (int s){
for(auto& [d, foo] : g[s]){
if(color[d] == -1){
color[d] = color[s] ^ 1;
dfs(d);
}
}
};
for(int i = 2; i <= (n << 1); i++){
fill(color.begin(), color.end(), -1);
for(int j = 1; j < i; j++){
if(color[j] == -1){
color[j] = 0;
dfs(j);
}
}
vector<vector<int>>part(2);
for(int j = 1; j < i; j++){
part[color[j]].emplace_back(j);
}
for(int j = 0; j < 2; j++){
while(true){
vector<int>p = part[j];
p.emplace_back(i);
if(Query(p) == p.size()){
break;
}
int low = 0, high = int(part[j].size()) - 2, pos = high + 1;
while(low <= high){
int mid = (low + high) >> 1;
p.clear();
for(int k = 0; k <= mid; k++){
p.emplace_back(part[j][k]);
}
p.emplace_back(i);
if(Query(p) == p.size()){
low = mid + 1;
}
else{
high = (pos = mid) - 1;
}
}
g[i].emplace_back(part[j][pos], -1);
g[part[j][pos]].emplace_back(i, -1);
part[j].erase(part[j].begin() + pos);
}
}
}
for(int i = 1; i <= (n << 1); i++){
if(g[i].size() == 1){
g[i][0].second = 1;
for(auto& [u, v] : g[g[i][0].first]){
if(u == i){
v = 1;
break;
}
}
continue;
}
for(int j = 0; j < 3; j++){
vector<int>p(1, i);
for(int k = 0; k < 3; k++){
if(j != k){
p.emplace_back(g[i][k].first);
}
}
if(j == 0 || Query(p) == 1){
g[i][j].second = 2;
for(auto& [u, v] : g[g[i][j].first]){
if(u == i){
v = 3;
break;
}
}
}
}
}
vector<bool>vis(n << 1 | 1, false);
for(int i = 1; i <= (n << 1); i++){
if(!vis[i]){
for(auto& [u, v] : g[i]){
if(v == 1 || v == -1){
vis[i] = vis[u] = true;
Answer(i, u);
break;
}
}
}
}
}
# | 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... |