Submission #587272

#TimeUsernameProblemLanguageResultExecution timeMemory
587272GioChkhaidzeParachute rings (IOI12_rings)C++14
100 / 100
1837 ms262144 KiB
#include <bits/stdc++.h> #define pb push_back #define f first #define s second using namespace std; const int Nn = 1e6 + 6; bool cycle, us[Nn]; int n, p[Nn], sz[Nn], pr[Nn], cr[Nn]; vector < int > v[Nn]; set < int > ans; int P(int x) { if (p[x] == x) return x; return p[x] = P(p[x]); } void Init(int N_) { n = N_; for (int i = 0; i < n; ++i) { ans.insert(i); p[i] = i; } } void intr(set < int > cur) { int crs = 0; for (set < int > :: iterator it = cur.begin(); it != cur.end(); ++it) { if (ans.find(*it) == ans.end()) continue; cr[++crs] = (*it); } ans.clear(); for (int i = 1; i <= crs; ++i) { ans.insert(cr[i]); } } vector < int > rec; void dfs(int x, int p, int fn) { pr[x] = p; us[x] = true; rec.pb(x); if (x == fn) { set < int > cur; cur.insert(x); x = pr[x]; cycle = true; while (x != fn) { cur.insert(x); x = pr[x]; } intr(cur); return ; } for (int i = 0; i < v[x].size(); ++i) { int to = v[x][i]; if (to != p && !us[to]) dfs(to, x, fn); if (cycle) return ; } } void Link(int A, int B) { int ap = P(A), bp = P(B); v[A].pb(B), v[B].pb(A); if (ap != bp) { if (sz[ap] < sz[bp]) swap(ap, bp); sz[ap] += sz[bp]; p[bp] = ap; } else { ++sz[ap]; if (sz[ap] <= 3) { cycle = false; dfs(A, B, B); } for (int i = 0; i < rec.size(); ++i) { us[rec[i]] = false; } rec.clear(); if (sz[ap] == 2) { set < int > cur; int crs = 0; for (set < int > :: iterator it = ans.begin(); it != ans.end(); ++it) { if (v[(*it)].size() >= 3) { cr[++crs] = (*it); } } ans.clear(); for (int i = 1; i <= crs; ++i) { ans.insert(cr[i]); } } } set < int > st; if (v[A].size() == 4) st.clear(), st.insert(A), intr(st); if (v[B].size() == 4) st.clear(), st.insert(B), intr(st); if (v[A].size() == 3) st.clear(), st.insert(A), st.insert(v[A][0]), st.insert(v[A][1]), st.insert(v[A][2]), intr(st); if (v[B].size() == 3) st.clear(), st.insert(B), st.insert(v[B][0]), st.insert(v[B][1]), st.insert(v[B][2]), intr(st); } int CountCritical() { return ans.size(); }

Compilation message (stderr)

rings.cpp: In function 'void dfs(int, int, int)':
rings.cpp:58:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |  for (int i = 0; i < v[x].size(); ++i) {
      |                  ~~^~~~~~~~~~~~~
rings.cpp: In function 'void Link(int, int)':
rings.cpp:80:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |   for (int i = 0; i < rec.size(); ++i) {
      |                   ~~^~~~~~~~~~~~
#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...