제출 #753712

#제출 시각아이디문제언어결과실행 시간메모리
753712nicksms열대 식물원 (Tropical Garden) (IOI11_garden)C++17
100 / 100
2573 ms27572 KiB
/** * Author: Nicholas Winschel * Created: 05.10.2023 22:07:36 **/ #include <bits/stdc++.h> using namespace std; using ll=long long; using db=long double; template<class T> using V=vector<T>; using vi = V<int>; using vl = V<ll>; using pi = pair<int,int>; #define f first #define s second #define sz(x) (int)((x).size()) void answer(int X); void count_routes(int N, int M, int P, int R[][2], int Q, int G[]); int inf = 1e9+500; void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) { V<vi> r(2*N); vi f(2*N, -1); for (int i = 0; i < M; i++) { if (f[R[i][0]] == -1 && f[R[i][1]] == -1) { f[R[i][0]] = R[i][1]+N; f[R[i][1]] = R[i][0]+N; } else if (f[R[i][0]] == -1) { f[R[i][0]] = R[i][1]; if (f[R[i][1]+N]==-1) { f[R[i][1]+N]=R[i][0]+N; } } else if (f[R[i][1]] == -1) { f[R[i][1]] = R[i][0]; if (f[R[i][0]+N]==-1) { f[R[i][0]+N]=R[i][1]+N; } } else if (f[R[i][0]+N] == -1 || f[R[i][1]+N]==-1) { if (f[R[i][0]+N]==-1) f[R[i][0]+N]=R[i][1]; if (f[R[i][1]+N]==-1) f[R[i][1]+N]=R[i][0]; } } for (int i = 0; i < N; i++) { if (f[i+N]==-1) f[i+N]=f[i]; r[f[i]].push_back(i); r[f[i+N]].push_back(i+N); } vi ub(2*N, inf), b(2*N,inf); V<bool> vis(2*N); auto dfs = [&](int v, int c, auto &&dfs) -> int { if (vis[v]) return c; vis[v]=true; ub[v]=c; int ret = 0; for (int x : r[v]) { ret = max(ret, dfs(x,c+1,dfs)); } return ret; }; int cub = dfs(P,0,dfs); swap(ub,b); vis=V<bool>(2*N); int cb = dfs(P+N,0,dfs); swap(ub,b); for (int i = 0; i < Q; i++) { int K = G[i]; int ans = 0; for (int i = 0; i < N; i++) { if ((ub[i] <= K && (ub[i] == K || (cub && (K-ub[i])%cub == 0))) || (b[i] <= K && (b[i] == K || (cb && (K-b[i])%cb == 0)))) ans++; } answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...