Submission #1298858

#TimeUsernameProblemLanguageResultExecution timeMemory
1298858Jawad_Akbar_JJTropical Garden (IOI11_garden)C++17
100 / 100
1451 ms61932 KiB
#include <iostream> #include <queue> #include "garden.h" #include "gardenlib.h" using namespace std; const int Sz = 3<<17, inf = 2e9; vector<int> nei[Sz], rev[Sz]; int cyc[Sz], seen[Sz], Dfs[Sz], cur, Mn[2][Sz], lst[Sz], bst[Sz], sbst[Sz]; void dfs(int u){ seen[u] = 1; if (Dfs[u]) cyc[u] = cur - lst[u]; lst[u] = cur++; Dfs[u]++; for (int i : nei[u]){ if (Dfs[i] == 2 or (Dfs[i] == 0 and seen[i] == 1)) continue; dfs(i); } Dfs[u]--; } void bfs(int s, int id){ for (int i=0;i<Sz;i++) Mn[id][i] = inf; Mn[id][s] = 0; queue<int> Q; Q.push(s); while (Q.size() > 0){ s = Q.front(); Q.pop(); for (int i : rev[s]){ if (Mn[id][i] > Mn[id][s] + 1) Mn[id][i] = Mn[id][s] + 1, Q.push(i); } } } void count_routes(int n, int m, int p, int R[][2], int q, int g[]){ for (int i=0;i<n;i++) bst[i] = Sz; for (int i=m-1;i>=0;i--){ int a = R[i][0], b = R[i][1]; sbst[a] = bst[a], bst[a] = i; sbst[b] = bst[b], bst[b] = i; } for (int i=0;i<n;i++){ int K = 0; if (sbst[i] == Sz) sbst[i] = bst[i]; for (int e : {bst[i], sbst[i]}){ if (e == Sz) continue; int j = R[e][0] + R[e][1] - i; if (bst[j] == e) j += n; nei[i+K].push_back(j); rev[j].push_back(i+K); K = n; } } for (int i=0;i<n + n;i++){ if (seen[i] == 0) dfs(i); } bfs(p, 0); bfs(p + n, 1); for (int j=0;j<q;j++){ int ans = 0, d = g[j]; for (int i=0;i<n;i++){ bool t = 0; if (Mn[0][i] == d or Mn[1][i] == d) ans++; else if (Mn[0][i] <= d and cyc[p] != 0 and (d - Mn[0][i]) % cyc[p] == 0) ans++; else if (Mn[1][i] <= d and cyc[p+n] != 0 and (d - Mn[1][i]) % cyc[p + n] == 0) ans++; } answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...