제출 #1240605

#제출 시각아이디문제언어결과실행 시간메모리
1240605madamadam3Sphinx's Riddle (IOI24_sphinx)C++20
3 / 100
24 ms412 KiB
#include "sphinx.h" #include <bits/stdc++.h> using namespace std; using vi =vector<int>; using vvi =vector<vi>; #define pb push_back #define lb lower_bound #define ub upper_bound #define FOR(i, a, b) for (int i = a; i < b; i++) #define all(x) (x).begin(), (x).end() #define bg(x) (x).begin() #define en(x) (x).end() #define sz(x) int((x).size()) #define rev(x) reverse(all(x)) #define srt(x) sort(all(x)) #define each(a, x) for (auto &a : x) #define trace(x) for (auto &el : x) cout << el << " " struct DSU { int n; vi par, siz; DSU() {}; DSU(int N) { n = N; siz.assign(n, 1); par.resize(n); iota(all(par), 0); } int find(int v) { if (par[v] == v) return v; return par[v] = find(par[v]); } void unite(int a, int b) { a = find(a); b = find(b); if (a != b) { if (siz[b] > siz[a]) swap(a, b); par[b] = a; siz[a] += siz[b]; } } }; int n, m; vi x, y; vvi adj; vi even_to(int x, int col) { vi to_ret(n, n); for (int i = 0; i < n; i+=2) to_ret[i] = -1; if (x == 0) { to_ret[2] = n; to_ret[1] = col; } else { for (int i = 0; i <= x; i++) { to_ret[2*i + 1] = col; } } return to_ret; } vi odd_to(int x, int col) { vi to_ret(n, n); for (int i = 1; i < n; i += 2) to_ret[i] = -1; FOR(i, 0, x+1) to_ret[2*i+1] = col; return to_ret; } int count_components(vi &graph) { int cmps = 0; vector<bool> seen(n, false); FOR(i, 0, n) { if (seen[i]) continue; seen[i] = true; queue<int> q; q.push(i); while (!q.empty()) { int cur = q.front(); q.pop(); for (auto &v : adj[cur]) { if (seen[v]) continue; if (graph[v] != graph[cur]) continue; seen[v] = true; q.push(v); } } cmps++; } return cmps; } vi find_colours(int N, vi X, vi Y) { n = N; m = sz(X); x = X; y = Y; adj.assign(n, vi()); FOR(i, 0, m) adj[x[i]].pb(y[i]), adj[y[i]].pb(x[i]); vi graph(n, n); iota(graph.begin(), graph.end(), 0); if (n == 2) { graph[0] = perform_experiment({-1, 0}) == 1 ? 0 : 1; graph[1] = perform_experiment({0, -1}) == 1 ? 0 : 1; return graph; } auto dsu = DSU(n); FOR(i, 0, n-1) { vi test(n, n); test[i] = test[i+1] = -1; int perf = perform_experiment(test); if ((i == 0 || i == n - 2) && perf == 2) { dsu.unite(i, i+1); } else if (!(i == 0 || i == n - 2) && perf == 3) { dsu.unite(i, i+1); } } FOR(col, 0, n) { FOR(even_idx, 0, (n+1)/2) { vi even = even_to(even_idx, col); if (perform_experiment(even) != count_components(even)) { graph[dsu.find(2*even_idx)] = col; } } FOR(odd_idx, 0, n/2) { vi odd = odd_to(odd_idx, col); if (perform_experiment(odd) != count_components(odd)) { graph[dsu.find(2*odd_idx+1)] = col; } } } FOR(i, 0, n) { graph[i] = graph[dsu.find(i)]; } return graph; }
#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...