Submission #578333

#TimeUsernameProblemLanguageResultExecution timeMemory
578333nonsensenonsense1Game (APIO22_game)C++17
100 / 100
2483 ms86824 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define left dsafh #define right dslafh #define N 300000 #define L 20 bool left[L][N], right[L][N], done; int ind[L][N]; vector<int> g[N], gg[N]; int k; void build(int top, int l, int r, int lvl) { int m = l + r >> 1; for (int i = l; i <= m; ++i) { ind[lvl][i] = top; left[lvl][i] = 1; } for (int i = m; i < r; ++i) { ind[lvl][i] = top; right[lvl][i] = 1; } if (l < m) build(top * 2 + 1, l, m, lvl + 1); if (m + 1 < r) build(top * 2 + 2, m + 1, r, lvl + 1); } void init(int n, int k_) { memset(ind, -1, sizeof ind); k = k_; build(0, 0, k, 0); for (int i = 0; i < n; ++i) ind[0][i] = 0; } vector<int> ladd, radd; void addright(int v, int lvl) { if (right[lvl][v]) return; radd.push_back(v); ind[lvl + 1][v] = ind[lvl][v] * 2 + 2; right[lvl][v] = 1; if (left[lvl][v]) done = 1; for (int i = 0; i < (int)g[v].size(); ++i) if (ind[lvl][g[v][i]] == ind[lvl][v]) addright(g[v][i], lvl); } void addleft(int v, int lvl) { if (left[lvl][v]) return; ladd.push_back(v); ind[lvl + 1][v] = ind[lvl][v] * 2 + 1; left[lvl][v] = 1; if (right[lvl][v]) done = 1; for (int i = 0; i < (int)gg[v].size(); ++i) if (ind[lvl][gg[v][i]] == ind[lvl][v]) addleft(gg[v][i], lvl); } void run(int l, int r, int u, int v, bool edg, vector<int> &add, int lvl) { if (!edg && add.empty()) return; int m = l + r >> 1; ladd.clear(); radd.clear(); for (int i = 0; i < (int)add.size(); ++i) { int v = add[i]; for (int j = 0; j < (int)gg[v].size(); ++j) if (right[lvl][gg[v][j]] && ind[lvl][gg[v][j]] == ind[lvl][v]) addright(v, lvl); for (int j = 0; j < (int)g[v].size(); ++j) if (left[lvl][g[v][j]] && ind[lvl][g[v][j]] == ind[lvl][v]) addleft(v, lvl); } if (edg) { if (right[lvl][u]) addright(v, lvl); if (left[lvl][v]) addleft(u, lvl); } vector<int> ladd1 = ladd, radd1 = radd; if (m + 1 < r) { run(m + 1, r, u, v, u != m && v != m && edg && right[lvl][u] && right[lvl][v], radd1, lvl + 1); } if (l < m) { run(l, m, u, v, edg && u != m && v != m && left[lvl][u] && left[lvl][v], ladd1, lvl + 1); } } int add_teleporter(int u, int v) { if (u == v && u < k) return 1; g[u].push_back(v); gg[v].push_back(u); vector<int> vec; run(0, k, u, v, 1, vec, 0); return done; }

Compilation message (stderr)

game.cpp: In function 'void build(int, int, int, int)':
game.cpp:17:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   17 |   int m = l + r >> 1;
      |           ~~^~~
game.cpp: In function 'void run(int, int, int, int, bool, std::vector<int>&, int)':
game.cpp:70:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   70 |   int m = l + r >> 1;
      |           ~~^~~
#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...