제출 #1171239

#제출 시각아이디문제언어결과실행 시간메모리
1171239SmuggingSpun카멜레온의 사랑 (JOI20_chameleon)C++20
0 / 100
0 ms432 KiB
#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; } } } } } vector<vector<pair<int, int>>>g(n + 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++){ 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; 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 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...