Submission #821666

#TimeUsernameProblemLanguageResultExecution timeMemory
821666caganyanmazParachute rings (IOI12_rings)C++17
37 / 100
1908 ms220692 KiB
#include <bits/stdc++.h> #define pb push_back //#define DEBUGGING using namespace std; void __print(const char* s) { cerr << s; } void __print(int i) { cerr << i; } void __print(bool i) { cerr << (i ? "true" : "false"); } template<typename T> void __print(T& t) { cerr << "{"; int f = 0; for (auto& i : t) { cerr << (f++ ? ", " : ""); __print(i); } cerr << "}"; } void _print() { cerr << "]\n"; } template<typename T, typename... V> void _print(T t, V... v) { __print(t); if (sizeof...(v)) cerr << ", "; _print(v...); } #ifdef DEBUGGING #define debug(x...) cerr <<"[" << (#x) << "] = ["; _print(x) #else #define debug(x...) 42 #endif struct Node { int head; int tail; int size; int nxt; Node(int i) : head(i), tail(i), size(1), nxt(-1) {} Node() : Node(-1) {} }; constexpr static int MXN = 2e6; int n; set<int> p; vector<int> g[MXN]; Node node[MXN]; bitset<MXN> in_loop; int pred[MXN]; void merge(int a, int b); void Init(int N_) { n = N_; for (int i = 0; i < n; i++) { node[i] = Node(i); p.insert(i); } for (int i = 0; i < n; i++) pred[i] = -1; } void check(int node) { if (g[node].size() <= 2 || g[node].size() >= 5) return; set<int> p_new; if (g[node].size() == 3) for (int c : g[node]) if (p.find(c) != p.end()) p_new.insert(c); if (p.find(node) != p.end()) p_new.insert(node); debug(node, p_new); p = p_new; } set<int> current_a; bitset<MXN> visited; bool visited_loop = false; bool dfs(int node, int target) { visited[node] = true; if (node == target) { current_a.insert(node); in_loop[node] = true; return true; } bool valid = false; for (int c : g[node]) { if (!visited[c] && dfs(c, target)) { debug(node, c); valid = true; } } if (valid) { current_a.insert(node); in_loop[node] = true; } return valid; } void assign_pred(int node, int pp) { pred[node] = pp; visited[node] = true; for (int c : g[node]) if (!visited[node]) assign_pred(c, node); } void check(int a, int b) { current_a.clear(); if (!visited_loop) { debug("start"); dfs(a, b); visited.reset(); assign_pred(a, -1); // Create predecessors } else if (in_loop[a] && in_loop[b]) { debug("a"); current_a.insert(a); current_a.insert(b); } else if(!in_loop[a] && !in_loop[b]) { debug("b"); int i = a; for (; i != -1 && i != b && !in_loop[i]; i = pred[i]) in_loop[i] = true; if (i == b) { p.clear(); // Means two seperate return; } if (i != -1) current_a.insert(i); int j = b; for (; j != -1 && j != a && !in_loop[j]; j = pred[j]) in_loop[j] = true; if (j == a) { p.clear(); return; } if (j != -1) current_a.insert(j); // Finding two endpoints (they might the be same) } else { debug("c"); if (in_loop[b]) swap(a, b); assert(b != -1); for (; !in_loop[b]; b = pred[b]) { assert(b != -1); // It shouldn't happen since there is a loop in b's component in_loop[b] = true; } current_a.insert(b); current_a.insert(a); } for (auto it = current_a.begin(); it != current_a.end();) if (p.find(*it) == p.end()) it = current_a.erase(it); else it++; p = current_a; visited_loop = true; } void Link(int a, int b) { if (p.empty()) return; debug(a, b); g[a].pb(b); g[b].pb(a); check(a); check(b); if (node[a].head == node[b].head) { check(a, b); } else { merge(node[a].head, node[b].head); auto ddfs = [&] (int node, int pp) -> void { pred[node] = pp; for (int c : g[node]) if (pred[c] == -1 && !in_loop[c]) dfs(c, node); }; if (in_loop[a] || pred[a] != -1) ddfs(b, a); else if (in_loop[b] || pred[b] != -1) ddfs(a, b); } } int CountCritical() { debug(p); return p.size(); } void merge(int a, int b) { if (node[a].size < node[b].size) swap(a, b); node[a].size += node[b].size; node[node[a].tail].nxt = b; node[a].tail = node[b].tail; for (;b != -1; b = node[b].nxt) node[b].head = a; }

Compilation message (stderr)

rings.cpp: In function 'void check(int)':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:71:9: note: in expansion of macro 'debug'
   71 |         debug(node, p_new);
      |         ^~~~~
rings.cpp: In function 'bool dfs(int, int)':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:94:25: note: in expansion of macro 'debug'
   94 |                         debug(node, c);
      |                         ^~~~~
rings.cpp: In function 'void check(int, int)':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:121:17: note: in expansion of macro 'debug'
  121 |                 debug("start");
      |                 ^~~~~
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:128:17: note: in expansion of macro 'debug'
  128 |                 debug("a");
      |                 ^~~~~
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:134:17: note: in expansion of macro 'debug'
  134 |                 debug("b");
      |                 ^~~~~
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:159:17: note: in expansion of macro 'debug'
  159 |                 debug("c");
      |                 ^~~~~
rings.cpp: In function 'void Link(int, int)':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:184:9: note: in expansion of macro 'debug'
  184 |         debug(a, b);
      |         ^~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:212:9: note: in expansion of macro 'debug'
  212 |         debug(p);
      |         ^~~~~
#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...