제출 #62419

#제출 시각아이디문제언어결과실행 시간메모리
62419fallingstar열대 식물원 (Tropical Garden) (IOI11_garden)C++11
100 / 100
4050 ms119812 KiB
#include "garden.h" #include "gardenlib.h" #include <iostream> #include <vector> #include <stack> #include <set> #include <map> using namespace std; typedef pair<int, int> pii; const int N = 1.5e5 + 2; const int INF = 1e9 + 1; int n, m, src; pii org[2]; vector<int> g[N]; stack<pii> st; map<pii, int> vst, f[2], r[2]; vector<pair<pii, pii> > a; void Dfs(int u, int p) { pii pre(p, u); pii e(u, g[u].size() > 1 && g[u][0] == p ? g[u][1] : g[u][0]); f[0][pre] = f[1][pre] = -1; if (vst.find(e) == vst.end()) { vst[e] = 1; st.push(e); Dfs(e.second, u); vst[e] = 2; r[0][pre] = r[0][e]; r[1][pre] = r[1][e]; if (pre == org[0]) f[0][pre] = 0; else if (f[0][e] != -1) f[0][pre] = f[0][e] + 1; if (pre == org[1]) f[1][pre] = 0; else if (f[1][e] != -1) f[1][pre] = f[1][e] + 1; } else if (vst[e] == 1) { for (int i = 0; ;++i) { auto top = st.top(); st.pop(); if (top == org[0]) f[0][pre] = i; if (top == org[1]) f[1][pre] = i; ++r[0][pre]; ++r[1][pre]; if (top == e) break; } if (f[0][pre] == -1) r[0][pre] = -1; else f[0][pre] = (r[0][pre] - f[0][pre]) % r[0][pre]; if (f[1][pre] == -1) r[1][pre] = -1; else f[1][pre] = (r[1][pre] - f[1][pre]) % r[1][pre]; } else { r[0][pre] = r[0][e]; r[1][pre] = r[1][e]; if (pre == org[0]) f[0][pre] = 0; else if (f[0][e] != -1) f[0][pre] = f[0][e] + 1; if (pre == org[1]) f[1][pre] = 0; else if (f[1][e] != -1) f[1][pre] = f[1][e] + 1; } } void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) { n = N, m = M, src = P; for (int i = 0; i < m; ++i) { int u, v; u = R[i][0], v = R[i][1]; if (g[u].size() < 2) g[u].push_back(v); if (g[v].size() < 2) g[v].push_back(u); } org[0] = {src, g[src][0]}; org[1] = {src, g[src].size() > 1 ? g[src][1] : -1}; for (int u = 0; u < n; ++u) { while (!st.empty()) st.pop(); pii e(u, g[u][0]); if (vst.find(e) == vst.end()) Dfs(u, -1); a.push_back({{f[0][e], r[0][e]}, {f[1][e], r[1][e]}}); //cerr << f[0][e] << ' ' << r[0][e] << ' ' << f[1][e] << ' ' << r[1][e] << '\n'; } int q = Q; for (int i = 0; i < q; ++i) { int x = G[i], ans = 0; for (auto p: a) { auto satis = [](int x, pii q) -> bool { return q.first != -1 && (x == q.first || (x > q.first && q.second != -1 && (x - q.first) % q.second == 0)); }; ans += satis(x, p.first) || satis(x, p.second); } answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...