Submission #770850

#TimeUsernameProblemLanguageResultExecution timeMemory
770850marvinthangKeys (IOI21_keys)C++17
100 / 100
479 ms55392 KiB
/************************************* * author: marvinthang * * created: 02.07.2023 10:24:06 * *************************************/ #include <vector> #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define left ___left #define right ___right #define TIME (1.0 * clock() / CLOCKS_PER_SEC) #define MASK(i) (1LL << (i)) #define BIT(x, i) ((x) >> (i) & 1) #define __builtin_popcount __builtin_popcountll #define ALL(v) (v).begin(), (v).end() #define REP(i, n) for (int i = 0, _n = (n); i < _n; ++i) #define REPD(i, n) for (int i = (n); i--; ) #define FOR(i, a, b) for (int i = (a), _b = (b); i < _b; ++i) #define FORD(i, b, a) for (int i = (b), _a = (a); --i >= _a; ) #define FORE(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i) #define FORDE(i, b, a) for (int i = (b), _a = (a); i >= _a; --i) #define scan_op(...) istream & operator >> (istream &in, __VA_ARGS__ &u) #define print_op(...) ostream & operator << (ostream &out, const __VA_ARGS__ &u) #ifdef LOCAL #include "debug.h" #else #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); } #define DB(...) 23 #define db(...) 23 #define debug(...) 23 #endif template <class U, class V> scan_op(pair <U, V>) { return in >> u.first >> u.second; } template <class T> scan_op(vector <T>) { for (size_t i = 0; i < u.size(); ++i) in >> u[i]; return in; } template <class U, class V> print_op(pair <U, V>) { return out << '(' << u.first << ", " << u.second << ')'; } template <size_t i, class T> ostream & print_tuple_utils(ostream &out, const T &tup) { if constexpr(i == tuple_size<T>::value) return out << ")"; else return print_tuple_utils<i + 1, T>(out << (i ? ", " : "(") << get<i>(tup), tup); } template <class ...U> print_op(tuple<U...>) { return print_tuple_utils<0, tuple<U...>>(out, u); } template <class Con, class = decltype(begin(declval<Con>()))> typename enable_if <!is_same<Con, string>::value, ostream&>::type operator << (ostream &out, const Con &con) { out << '{'; for (__typeof(con.begin()) it = con.begin(); it != con.end(); ++it) out << (it == con.begin() ? "" : ", ") << *it; return out << '}'; } struct DisjointSet { int n, *lab = nullptr; DisjointSet(int _n = 0) { resize(_n); } void reset(void) { memset(lab, -1, (n + 1) * sizeof(int)); } void resize(int _n) { if (lab != nullptr) delete[] lab; n = _n; lab = new int[n + 1]; reset(); } int find(int u) { assert(u <= n); return lab[u] < 0 ? u : lab[u] = find(lab[u]); } bool connected(int u, int v) { return find(u) == find(v); } bool isRoot(int u) { return lab[u] < 0; } int size(int u) { return -lab[find(u)]; } bool join(int u, int v) { if ((u = find(u)) == (v = find(v))) return false; if (lab[u] > lab[v]) swap(u, v); lab[u] += lab[v]; lab[v] = u; return true; } }; using DSU = DisjointSet; // end of template vector <int> find_reachable(vector <int> r, vector <int> u, vector <int> v, vector <int> c) { int n = r.size(); int m = u.size(); vector <vector <pair <int, int>>> adj(n); REP(i, m) { adj[u[i]].emplace_back(c[i], v[i]); adj[v[i]].emplace_back(c[i], u[i]); } DSU dsu(n); bool changed = true; vector <bool> done(n); int mi = n + 1; vector <int> res; while (changed) { changed = false; vector <bool> visited(n); vector <bool> keys(n); vector <vector <int>> kn(n); vector <int> his; auto bfs = [&] (int s) { for (int k: his) { keys[k] = false; kn[k].clear(); } his.clear(); vector <int> q; q.push_back(s); visited[s] = true; for (int i = 0; i < q.size(); ++i) { int u = q[i]; if (!keys[r[u]]) { keys[r[u]] = true; his.push_back(r[u]); for (int v: kn[r[u]]) { int w = dsu.find(v); if (w != s) { visited[w] = true; dsu.lab[s] = w; return; } if (visited[v]) continue; visited[v] = true; q.push_back(v); } kn[r[u]].clear(); } for (auto [c, v]: adj[u]) { if (keys[c]) { int w = dsu.find(v); if (w != s) { visited[w] = true; dsu.lab[s] = w; return; } if (visited[v]) continue; visited[v] = true; q.push_back(v); } else { if (kn[c].empty()) his.push_back(c); kn[c].push_back(v); } } } done[s] = true; if (mi > q.size()) { mi = q.size(); res = q; } else if (mi == q.size()) res.insert(res.end(), ALL(q)); }; REP(i, n) if (!visited[i] && !done[i] && dsu.find(i) == i) { changed = true; bfs(i); } } vector <int> ans(n); for (int x: res) ans[x] = 1; return ans; }

Compilation message (stderr)

keys.cpp: In lambda function:
keys.cpp:114:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |    for (int i = 0; i < q.size(); ++i) {
      |                    ~~^~~~~~~~~~
keys.cpp:150:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  150 |    if (mi > q.size()) {
      |        ~~~^~~~~~~~~~
keys.cpp:153:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  153 |    } else if (mi == q.size()) res.insert(res.end(), ALL(q));
      |               ~~~^~~~~~~~~~~
#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...