Submission #1039472

#TimeUsernameProblemLanguageResultExecution timeMemory
1039472juicyChameleon's Love (JOI20_chameleon)C++17
100 / 100
33 ms612 KiB
// https://codeforces.com/blog/entry/74871?#comment-591244 #include <bits/stdc++.h> #include "chameleon.h" using namespace std; namespace { ostream &operator << (ostream &os, vector<int> v) { for (int i = 0; i < v.size(); ++i) { os << (i ? ", " : "") << i; } return os; } void __print() { cerr << "]\n"; } template<class T, class... V> void __print(T t, V... v) { cerr << t; if (sizeof...(v)) { cerr << ", "; } __print(v...); } #define debug(x...) cerr << "[" << #x << "] = ["; __print(x); } void Solve(int N) { vector<vector<int>> g(2 * N); auto add = [&](int a, int b) { g[a].push_back(b); g[b].push_back(a); }; vector<int> c(2 * N, -1); auto dfs = [&](auto dfs, int u) -> void { for (int v : g[u]) { if (c[v] == -1) { c[v] = c[u] ^ 1; dfs(dfs, v); } else { assert(c[v] == 1 - c[u]); } } }; array<vector<int>, 2> cands; auto color = [&](int p) { fill(c.begin(), c.end(), -1); for (auto it : {0, 1}) { cands[it].clear(); } for (int i = 0; i < p; ++i) { if (c[i] == -1) { c[i] = 0; dfs(dfs, i); } cands[c[i]].push_back(i + 1); } }; auto check = [&](vector<int> v, int p) { v.push_back(p + 1); assert(v.size() > 1); return Query(v) != v.size(); }; for (int i = 1; i < 2 * N; ++i) { color(i); for (auto it : {0, 1}) { while (cands[it].size() && check(cands[it], i)) { int L = 0, R = cands[it].size() - 1, p = -1; while (L <= R) { int md = (L + R) / 2; if (check(vector<int>(cands[it].begin(), cands[it].begin() + md + 1), i)) { p = md; R = md - 1; } else { L = md + 1; } } assert(~p); add(i, cands[it][p] - 1); cands[it] = vector<int>(cands[it].begin() + p + 1, cands[it].end()); } } } auto nxt = [&](int x, int y) { if ((x += y) >= 3) { x -= 3; } if (x < 0) { x += 3; } return x; }; vector<int> res(2 * N); for (int i = 0; i < 2 * N; ++i) { for (int x : g[i]) { res[i] += x; } if (g[i].size() == 3) { for (int j = 0; j < 3; ++j) { if (Query({i + 1, g[i][j] + 1, g[i][nxt(j, 1)] + 1}) == 1) { int p = g[i][nxt(j, -1)]; res[i] -= p; res[p] -= i; } } } } for (int i = 0; i < 2 * N; ++i) { if (i < res[i]) { Answer(i + 1, res[i] + 1); } } }

Compilation message (stderr)

chameleon.cpp: In function 'std::ostream& {anonymous}::operator<<(std::ostream&, std::vector<int>)':
chameleon.cpp:11:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   11 |     for (int i = 0; i < v.size(); ++i) {
      |                     ~~^~~~~~~~~~
chameleon.cpp: In lambda function:
chameleon.cpp:67:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |     return Query(v) != v.size();
      |            ~~~~~~~~~^~~~~~~~~~~
chameleon.cpp: At global scope:
chameleon.cpp:17:8: warning: 'void {anonymous}::__print()' defined but not used [-Wunused-function]
   17 |   void __print() {
      |        ^~~~~~~
chameleon.cpp:10:12: warning: 'std::ostream& {anonymous}::operator<<(std::ostream&, std::vector<int>)' defined but not used [-Wunused-function]
   10 |   ostream &operator << (ostream &os, vector<int> 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...