Submission #958090

#TimeUsernameProblemLanguageResultExecution timeMemory
958090d4xnTropical Garden (IOI11_garden)C++17
49 / 100
21 ms66760 KiB
#include "garden.h" #include "gardenlib.h" #include <bits/stdc++.h> using namespace std; const int N = 2e5+5, B = 20; int n, m, p, q, adj[2][N]; pair<bool, int> dp[2][B][N]; int f(int x, int k) { pair<int, int> pr = make_pair(0, x); for (int i = 29; i >= 0; i--) { if ((k >> i) & 1) { pr = dp[pr.first][i][pr.second]; } } return pr.second; } void count_routes(int n, int m, int p, int R[][2], int q, int G[]) { for (int i = 0; i < n; i++) { adj[0][i] = adj[1][i] = -1; } for (int i = 0; i < m; i++) { int x = R[i][0]; int y = R[i][1]; if (adj[0][x] == -1) { adj[0][x] = adj[1][x] = y; } else if (adj[1][x] == adj[0][x]) { adj[1][x] = y; } if (adj[0][y] == -1) { adj[0][y] = adj[1][y] = x; } else if (adj[1][y] == adj[0][y]) { adj[1][y] = x; } } for (int i = 0; i < n; i++) { int x = adj[0][i]; if (x == -1) { dp[0][0][i] = make_pair(0, i); } else { dp[0][0][i] = make_pair((adj[0][x] == i), x); } x = adj[1][i]; if (x == -1) { dp[1][0][i] = make_pair(0, i); } else { dp[1][0][i] = make_pair((adj[0][x] == i), x); } } for (int i = 1; i < B; i++) { for (int j = 0; j < n; j++) { pair<int, int> mid = dp[0][i-1][j]; dp[0][i][j] = dp[mid.first][i-1][mid.second]; mid = dp[1][i-1][j]; dp[1][i][j] = dp[mid.first][i-1][mid.second]; } } cin >> q; for (int i = 0; i < q; i++) { int x = G[i]; int ans = 0; for (int j = 0; j < n; j++) { if (f(j, x) == p) ans++; } answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...