제출 #964061

#제출 시각아이디문제언어결과실행 시간메모리
964061kilkuwuGame (APIO22_game)C++17
100 / 100
1690 ms68108 KiB
#include "game.h" #include <bits/stdc++.h> int n, k; constexpr int N = 3e5 + 5; int lb[N], rb[N]; std::vector<int> adj[N]; std::vector<int> radj[N]; void add_edge(int u, int v) { adj[u].push_back(v); radj[v].push_back(u); } void init(int _n, int _k) { n = _n + 1; k = _k; for (int i = 1; i <= n; i++) { lb[i] = 0; rb[i] = k + 1; } for (int i = 1; i <= k; i++) { lb[i] = i; rb[i] = i; } for (int i = 1; i + 1 <= k; i++) { add_edge(i, i + 1); } } bool update_edge(int, int); bool update_vertex(int u) { for (int v : adj[u]) { if (update_edge(u, v)) return true; } for (int v : radj[u]) { if (update_edge(v, u)) return true; } return false; } bool update_edge(int u, int v) { int be_reached_min_u = lb[u]; int be_reached_max_u = u <= k ? rb[u] : rb[u] - 1; int can_reach_min_v = v <= k ? lb[v] : lb[v] + 1; int can_reach_max_v = rb[v]; // std::cerr << u << " " << v << std::endl; // std::cerr << be_reached_min_u << " " << be_reached_max_u << " " << can_reach_max_v << " " << can_reach_min_v << std::endl; if (be_reached_min_u >= can_reach_max_v) { return true; } if (be_reached_max_u < can_reach_min_v) { return false; } if ((lb[v] + rb[v]) / 2 + 1 <= be_reached_min_u) { // we can shift it to the right int m = (lb[v] + rb[v]) / 2; while (m + 1 <= be_reached_min_u) { lb[v] = m + 1; m = (lb[v] + rb[v]) / 2; } if (update_vertex(v)) return true; } if ((lb[u] + rb[u]) / 2 >= can_reach_max_v) { int m = (lb[u] + rb[u]) / 2; while (m >= can_reach_max_v) { rb[u] = m; m = (lb[u] + rb[u]) / 2; } if (update_vertex(u)) return true; } return false; } int add_teleporter(int u, int v) { u++, v++; if (u == v) { if (u <= k) { return 1; } return 0; } if (v <= u && u <= k) { // eliminates return 1; } add_edge(u, v); return update_edge(u, v); }
#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...