Submission #372435

#TimeUsernameProblemLanguageResultExecution timeMemory
372435KoD카멜레온의 사랑 (JOI20_chameleon)C++17
40 / 100
28 ms492 KiB
#include <bits/stdc++.h> #include "chameleon.h" template <class T> using Vec = std::vector<T>; void Solve(int N) { Vec<Vec<int>> graph(2 * N + 1); if (N <= 50) { for (int u = 1; u <= 2 * N; ++u) { for (int v = u + 1; v <= 2 * N; ++v) { const auto kinds = Query({ u, v }); if (kinds == 1) { graph[u].push_back(v); graph[v].push_back(u); } } } } else { for (int u = 1; u <= N; ++u) { std::queue<Vec<int>> que; { Vec<int> cand(N); std::iota(cand.begin(), cand.end(), N + 1); que.push(std::move(cand)); } while (!que.empty()) { auto ask = que.front(); que.pop(); ask.push_back(u); if (Query(ask) == (int) ask.size()) { continue; } ask.pop_back(); if (ask.size() == 1) { graph[u].push_back(ask.front()); graph[ask.front()].push_back(u); continue; } const int m = (int) ask.size() / 2; Vec<int> left(ask.begin(), ask.begin() + m); Vec<int> right(ask.begin() + m, ask.end()); que.push(std::move(left)); que.push(std::move(right)); } } } Vec<Vec<char>> prob(2 * N + 1, Vec<char>(2 * N + 1)); for (int u = 1; u <= 2 * N; ++u) { if (graph[u].size() == 1) { prob[u][graph[u].front()] = true; } else { assert(graph[u].size() == 3); for (int ignore = 0; ignore < 3; ++ignore) { Vec<int> ask; ask.push_back(u); for (int k = 0; k < 3; ++k) { if (ignore != k) { ask.push_back(graph[u][k]); } } if (Query(ask) == 2) { prob[u][graph[u][ignore]] = true; } } } } for (int u = 1; u <= 2 * N; ++u) { for (int v = u + 1; v <= 2 * N; ++v) { if (prob[u][v] && prob[v][u]) { Answer(u, v); } } } }
#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...