제출 #1220004

#제출 시각아이디문제언어결과실행 시간메모리
1220004nicolo_010스핑크스 (IOI24_sphinx)C++20
28.50 / 100
115 ms1208 KiB
#include <bits/stdc++.h> #include "sphinx.h" using namespace std; template <typename T> using v = vector<T>; using pii = pair<int, int>; using ll = long long; #define rep(i, k, n) for (int i = k; i < n; i++) int cnt; v<bool> vis; v<v<int>> adj; void dfs(int n, int u, v<int> &neg) { vis[n] = true; int aux = neg.size(); for (auto x : adj[n]) { if (!vis[x] && x != u && neg[x] == aux) dfs(x, u, neg); } } int bs(int u, v<int> trees, v<int> &cmp) { int l = 0, r = trees.size()-1; int ans; int n = cmp.size(); while (l <= r) { map<int, int> mp; int m = (l+r)/2; rep(i, m+1, (int)trees.size()) { mp[trees[i]]++; } v<int> query = cmp; rep(i, 0, n) { if (mp.count(cmp[i]) || cmp[i] == -2) query[i] = n; else query[i] = -1; } query[u] = -1; cnt = 0; vis.assign(n, false); rep(i, 0, n) { if (query[i] == n && vis[i] == false) { cnt++; dfs(i, u, query); } } int coloured = m+1; int compon = perform_experiment(query); //cout << m << " " << coloured << " " << cnt << " " << compon << endl; if (compon == cnt+coloured) { ans = trees[m]; r = m-1; } else if (compon > cnt+coloured) { l = m+1; } } return ans; } int count(v<int> &query, int u) { int n = query.size(); vis.assign(n, false); cnt = 0; rep(i, 0, n) { if (vis[i] == false && query[i] == n) { //if (u == 8) cout << i << " " << cnt << endl; cnt++; dfs(i, u, query); } } return cnt; } v<int> find_colours(int N, v<int> X, v<int> Y) { int n = N; v<int> trees; int id = 0; v<int> cmp(n, -2); cmp[0] = 0; id++; trees.push_back(0); adj.resize(n); int m = X.size(); rep(i, 0, m) { int a = X[i], b = Y[i]; adj[a].push_back(b); adj[b].push_back(a); } rep(i, 1, n) { cmp[i] = -1; v<int> query = cmp; rep(j, 0, n) { if (cmp[j] == -2) query[j] = n; else query[j] = -1; } int comp = count(query, i); //if (i == 8) for (auto x : query) cout << x << endl; int ans = perform_experiment(query); //if (i == 8) cout << comp << " " << ans << " " << trees.size() << endl; if (ans == comp + trees.size()) { cmp[i] = bs(i, trees, cmp); } else { cmp[i] = id; trees.push_back(id); id++; } } return cmp; }
#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...