Submission #639744

#TimeUsernameProblemLanguageResultExecution timeMemory
639744Hacv16Tropical Garden (IOI11_garden)C++17
49 / 100
132 ms50864 KiB
#include<bits/stdc++.h> #include "garden.h" #include "gardenlib.h" using namespace std; typedef long long ll; typedef pair<int, int> pii; const int MAX = 2e5 + 15; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; #define pb push_back #define sz(x) (int) x.size() #define fr first #define sc second #define mp make_pair #define all(x) x.begin(), x.end() #define dbg(x) cerr << #x << ": " << "[ " << x << " ]\n" int dist[MAX][2], cyc[2]; bool seen[MAX]; vector<int> adj[MAX], rev[MAX]; void dfs(int u, int end, int d, int aux){ dist[u][aux] = d; seen[u] = true; for(auto v : rev[u]){ if(v == end){ cyc[aux] = dist[u][aux] + 1; continue; } if(!seen[v]) dfs(v, end, d + 1, aux); } } void count_routes(int n, int m, int p, int r[][2], int q, int qrs[]) { for(int i = 0; i < m; i++){ int u = r[i][0], v = r[i][1]; if(sz(adj[u]) < 2) adj[u].pb(v); //only 2 edges matter if(sz(adj[v]) < 2) adj[v].pb(u); } vector<int> pai(2 * n, -1); //functional graph for(int i = 0; i < n; i++){ for(int j = 0; j < min(2, sz(adj[i])); j++){ int v = adj[i][j]; int cur = (adj[v][0] == i) * n + v; pai[j * n + i] = cur; } } for(int i = n; i < 2 * n; i++) if(pai[i] == -1) pai[i] = pai[i - n]; for(int i = 0; i < 2 * n; i++) rev[pai[i]].pb(i); memset(dist, -1, sizeof(dist)); cyc[0] = cyc[1] = INF; dfs(p, p, 0, 0); memset(seen, false, sizeof(seen)); dfs(p + n, p + n, 0, 1); vector<vector<int>> fdist(2, vector<int>(2 * MAX)); for(int i = 0; i < 2; i++){ for(int j = 0; j < n; j++){ if(dist[j][i] == -1) continue; fdist[i][dist[j][i]]++; } } for(int i = 0; i < q; i++){ int k = qrs[i], ans = 0; for(int j = 0; j < 2; j++){ for(int d = k % cyc[j]; d <= min(n, k); d += cyc[j]) ans += fdist[j][d]; } answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...