Submission #551262

#TimeUsernameProblemLanguageResultExecution timeMemory
551262Sohsoh84Tropical Garden (IOI11_garden)C++17
100 / 100
2416 ms48872 KiB
#include "garden.h" #include "gardenlib.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define debug(x) cerr << #x << ": " << x << endl; const ll MAXN = 1e6 + 10; int n, m, p, deg[MAXN], F[MAXN], dist[2][MAXN], cyc[2]; vector<int> adj[MAXN]; bool vis[MAXN]; inline void add_edge(int u, int v) { F[u] = v; adj[v].push_back(u); } inline void add(int u, int v) { if (deg[u] > 1) return; if (deg[u] == 0) { if (deg[v] == 0) add_edge(u << 1 | 1, v << 1); else add_edge(u << 1 | 1, v << 1 | 1); } else { if (deg[v] == 0) add_edge(u << 1, v << 1); else add_edge(u << 1, v << 1 | 1); } } void dfs(int v, int len, int ind) { vis[v] = true; dist[ind][v] = len; for (int u : adj[v]) { if (vis[u]) cyc[ind] = len; else dfs(u, len + 1, ind); } } inline bool f(int ind, int v, int k) { if (!dist[ind][v]) return false; k -= dist[ind][v] - 1; if (k == 0) return true; if (k < 0) return false; return cyc[ind] && k % cyc[ind] == 0; } void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) { n = N, m = M, p = P; p++; for (int i = 0; i < m; i++) { int u = R[i][0], v = R[i][1]; u++; v++; add(u, v); add(v, u); deg[u]++; deg[v]++; } for (int v = 1; v <= n; v++) if (!F[v << 1]) add_edge(v << 1, F[v << 1 | 1]); dfs(p << 1, 1, 0); memset(vis, false, sizeof vis); dfs(p << 1 | 1, 1, 1); for (int i = 0; i < Q; i++) { int ans = 0; for (int v = 1; v <= n; v++) ans += (f(0, v << 1 | 1, G[i]) || f(1, v << 1 | 1, G[i])); answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...