Submission #236817

#TimeUsernameProblemLanguageResultExecution timeMemory
236817srvltTropical Garden (IOI11_garden)C++14
0 / 100
128 ms39928 KiB
#include "garden.h" #include "gardenlib.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define ll long long #define ull unsigned long long #define db long double #define pb push_back #define ppb pop_back #define F first #define S second #define mp make_pair #define all(x) (x).begin(), (x).end() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); typedef pair <int, int> pii; typedef pair <ll, ll> pll; typedef vector <int> vi; typedef vector <ll> vll; typedef tree <pii, null_type, less <pii>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; const int max_N = 500005; int n, m, p, cnt; vi adj[max_N], g[max_N], gr[max_N]; pii edge[max_N], E[max_N]; map <pii, int> ind; int used[max_N]; vi vec; int cycle = 0, cyc[max_N], pind[max_N]; void dfs(int u, int v, int d) { used[v] = 1; for (int to : g[v]) { if (to == u) { cycle = d + 1; } if (used[to] == 0) { dfs(u, to, d + 1); } } } queue <int> q; int dist[max_N], zero[max_N]; void bfs(int s) { memset(& dist, 0, sizeof(dist)); memset(& used, 0, sizeof(used)); used[s] = 1; q.push(s); while (!q.empty()) { int v = q.front(); q.pop(); for (int to : g[v]) { if (!used[to]) { used[to] = 1; dist[to] = dist[v] + 1; q.push(to); } } } } int get(int k) { int res = 0; for (int i = 0; i < n; i++) { if (i == p) { continue; } int v = zero[i]; bfs(v); for (int j : adj[p]) { int d = dist[pind[j]]; int c = cyc[pind[j]]; if ((c == 0 && k == d) || (c > 0 && k >= d && (k - d) % c == 0)) { res++; } } } return res; } int get_end(int v, int e) { return edge[e].F + edge[e].S - v; } void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) { n = N, m = M, p = P; for (int i = 0; i < m; i++) { adj[R[i][0]].pb(i + 1); adj[R[i][1]].pb(i + 1); edge[i + 1] = {R[i][0], R[i][1]}; } for (int i = 0; i < n; i++) { E[cnt] = {i, 0}; ind[{i, 0}] = cnt++; for (int j : adj[i]) { E[cnt] = {i, j}; ind[{i, j}] = cnt++; } } for (int i = 0; i < n; i++) { int to = get_end(i, adj[i][0]); g[ind[{i, 0}]].pb(ind[{to, adj[i][0]}]); for (int j : adj[i]) { int tmp = (j == adj[i][0] && (int)adj[i].size() > 1); to = get_end(i, adj[i][tmp]); g[ind[{i, j}]].pb(ind[{to, adj[i][tmp]}]); } } memset(& used, 0, sizeof(used)); for (int i = 0; i < cnt; i++) { for (int j : g[i]) { gr[j].pb(i); } } for (int i : adj[p]) { int v = ind[{p, i}]; pind[i] = v; used[v] = 1; q.push(v); cycle = 0; dfs(v, v, 0); cyc[v] = cycle; } for (int i = 0; i < cnt; i++) { if (E[i].S == 0) { zero[E[i].F] = i; } } for (int i = 0; i < Q; i++) { answer(get(G[i])); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...