Submission #587184

#TimeUsernameProblemLanguageResultExecution timeMemory
587184GioChkhaidzeParachute rings (IOI12_rings)C++14
20 / 100
1773 ms139016 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, rekt, f[Nn], us[Nn], in_cycle[Nn]; int n, ans, degreemax, len, comp, p[Nn], sz[Nn]; set < pair < int , int > > st; vector < int > v[Nn]; int P(int x) { if (p[x] == x) return x; return p[x] = P(p[x]); } void Init(int N_) { n = ans = N_; degreemax = 0; for (int i = 0; i < n; ++i) { st.insert({v[i].size(), i}); p[i] = i; } } void dfs(int x, int p, int fn) { ++len; in_cycle[x] = true; if (x == fn) { cycle = true; return ; } for (int i = 0; i < v[x].size(); ++i) { int to = v[x][i]; if (to != p) dfs(to, x, fn); if (cycle) return ; } in_cycle[x] = false; --len; } void Link(int A, int B) { int ap = P(A), bp = P(B); if (ap != bp) { if (sz[ap] < sz[bp]) swap(ap, bp); sz[ap] += sz[bp]; p[bp] = ap; } else { if (!cycle) { comp = A; dfs(A, A, B); assert(cycle == true); } else if (cycle && P(comp) != ap) { rekt = true; } } st.erase(st.find({v[A].size(), A})); st.erase(st.find({v[B].size(), B})); v[A].pb(B), v[B].pb(A); st.insert({v[A].size(), A}); st.insert({v[B].size(), B}); if (v[A].size() > v[degreemax].size()) degreemax = A; if (v[B].size() > v[degreemax].size()) degreemax = B; } bool check(int x) { if (cycle && !in_cycle[x]) return 0; st.erase(st.find({v[x].size(), x})); for (int i = 0; i < v[x].size(); ++i) { int to = v[x][i]; st.erase(st.find({v[to].size(), to})); st.insert({v[to].size() - 1, to}); } bool ok = true; if (st.size() && (*st.rbegin()).f > 2) ok = false; for (int i = 0; i < v[x].size(); ++i) { int to = v[x][i]; st.erase(st.find({v[to].size() - 1, to})); st.insert({v[to].size(), to}); } st.insert({v[x].size(), x}); return ok; } int CountCritical() { if (rekt) return 0; assert(n <= 5000); if (v[degreemax].size() <= 2) { if (!cycle) return n; return len; } int res = 0; for (int i = 0; i < n; ++i) { res += check(i); } return res; if (v[degreemax].size() > 3) { if (cycle && !in_cycle[degreemax]) return 0; st.erase(st.find({v[degreemax].size(), degreemax})); if ((*st.rbegin()).f > 3) return 0; st.insert({v[degreemax].size(), degreemax}); for (int i = 0; i < v[degreemax].size(); ++i) { us[v[degreemax][i]] = true; } bool ok = true; for (int i = 0; i < n; ++i) { if (i != degreemax && !us[i] && v[i].size() > 2) { ok = false; break; } } for (int i = 0; i < v[degreemax].size(); ++i) { us[v[degreemax][i]] = false; } return ok; } if (v[degreemax].size() == 3) { int res = 0; res += check(degreemax); res += check(v[degreemax][0]); res += check(v[degreemax][1]); res += check(v[degreemax][2]); return res; } }

Compilation message (stderr)

rings.cpp: In function 'void dfs(int, int, int)':
rings.cpp:34:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |  for (int i = 0; i < v[x].size(); ++i) {
      |                  ~~^~~~~~~~~~~~~
rings.cpp: In function 'bool check(int)':
rings.cpp:74:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |  for (int i = 0; i < v[x].size(); ++i) {
      |                  ~~^~~~~~~~~~~~~
rings.cpp:82:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |  for (int i = 0; i < v[x].size(); ++i) {
      |                  ~~^~~~~~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:111:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |   for (int i = 0; i < v[degreemax].size(); ++i) {
      |                   ~~^~~~~~~~~~~~~~~~~~~~~
rings.cpp:123:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  123 |   for (int i = 0; i < v[degreemax].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...