Submission #1244561

#TimeUsernameProblemLanguageResultExecution timeMemory
1244561AlperenT_Sphinx's Riddle (IOI24_sphinx)C++20
36 / 100
31 ms412 KiB
#include "sphinx.h" #include <bits/stdc++.h> using namespace std; void dfs(int cur, vector<bool> &visited, vector<vector<int>> &adjacency, int erased) { visited[cur] = true; for (auto &i : adjacency[cur]) { if (visited[i] || i == erased) continue; dfs(i, visited, adjacency, erased); } } int countComponents(int erased, int N, vector<vector<int>> &adjacency) { vector<bool> visited(N, false); int cnt = 1; for (int i = 0; i < N; ++i) { if (visited[i] || i == erased) continue; dfs(i, visited, adjacency, erased); ++cnt; } return cnt; } void findColours(vector<int> &G, int N, int mod) { vector<bool> erased(N / 2, false); for (int colour = 0; colour < N; ++colour) { // cout << "COLOUR: " << colour << endl; bool done = true; for (int i = 0; i < N / 2; ++i) { if (!erased[i]) { done = false; break; } } if (done) return; vector<int> E(N, N); for (int i = 0; i < N / 2; ++i) { if (erased[i]) continue; E[i * 2 + mod] = -1; E[i * 2 + 1 - mod] = colour; } int expected = 0; int cur = -10; for (int i = 0; i < N; ++i) { if (E[i] != cur) ++expected; cur = E[i]; } // for (int &i : E) cout << i << ' '; // cout << endl; // cout << "EXPECTED: " << expected << endl; if (perform_experiment(E) == expected) continue; // cout << "FOUND SOMETHING" << endl; int remainCount = 0; for (int i = 0; i < N / 2; ++i) { if (erased[i]) continue; ++remainCount; } // cout << "REMAINING: " << remainCount << endl; int left = 0, right = remainCount; while (left < right - 1) { // cout << "BIN: " << left << ' ' << right << endl; int mid = (left + right) / 2; // cout << "MID: " << mid << endl; E.assign(N, N); int cur = 0; for (int i = 0; i < N / 2; ++i) { if (cur == mid) break; if (erased[i]) continue; if (cur >= left) { E[i * 2 + mod] = -1; E[i * 2 + 1 - mod] = colour; } ++cur; } int expected = 0; cur = -10; for (int i = 0; i < N; ++i) { if (E[i] != cur) ++expected; cur = E[i]; } // for (int &i : E) cout << i << ' '; // cout << endl; // cout << "EXPECTED: " << expected << endl; if (perform_experiment(E) < expected) right = mid; else left = mid; } // cout << "BIN DONE WITH LEFT: " << left << endl; cur = 0; for (int i = 0; i < N / 2; ++i) { if (erased[i]) continue; if (cur == left) { // cout << "FOUND THAT " << i * 2 + mod << " HAS COLOUR " << colour << endl; G[i * 2 + mod] = colour; erased[i] = true; break; } ++cur; } --colour; } } std::vector<int> find_colours(int N, std::vector<int> X, std::vector<int> Y) { vector<int> G(N, -1); // vector<vector<int>> adjacency(N); // for (int i = 0; i < X.size(); ++i) { // adjacency[X[i]].push_back(Y[i]); // adjacency[Y[i]].push_back(X[i]); // } findColours(G, N, 0); findColours(G, N, 1); if (N % 2) { vector<int> E(N, N); E[N - 1] = -1; for (int colour = 0; colour < N; ++colour) { E[N - 2] = colour; if (perform_experiment(E) < 3) { G[N - 1] = colour; break; } } } return G; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...