Submission #551309

#TimeUsernameProblemLanguageResultExecution timeMemory
551309alireza_kavianiTropical Garden (IOI11_garden)C++17
100 / 100
2869 ms61204 KiB
#include "garden.h" #include "gardenlib.h" #include <bits/stdc++.h> using namespace std; #define sep " " #define SZ(x) int((x).size()) const int MAXN = 3e5 + 10; int n , m , p , nxt[MAXN] , V[MAXN] , U[MAXN] , comp[MAXN] , mark[MAXN] , H[MAXN] , ind[MAXN] , valid[MAXN] , first[MAXN]; vector<int> E[MAXN] , vec , cycle[MAXN] , adj[MAXN] , par[MAXN]; void PreDFS(int v){ mark[v] = 1; if(!mark[nxt[v]]){ PreDFS(nxt[v]); } vec.push_back(v); } void DFS(int v , int cmp , int root , int h = 0){ if(valid[v]) vec.push_back(h); par[v] = vec; H[v] = h; comp[v] = cmp; ind[v] = root; for(int u : adj[v]){ if(comp[u] != -1) continue; DFS(u , cmp , root , h + 1); } if(valid[v]) vec.pop_back(); } void count_routes(int N, int M, int P, int R[][2], int Q, int G[]){ fill(comp , comp + MAXN , -1); fill(first , first + MAXN , -1); n = N; m = M; p = P; for(int i = 0 ; i < m ; i++){ V[i] = R[i][0]; U[i] = R[i][1]; E[V[i]].push_back(2 * i); E[U[i]].push_back(2 * i + 1); if(first[V[i]] == -1){ first[V[i]] = 2 * i + 1; } if(first[U[i]] == -1){ first[U[i]] = 2 * i; } } for(int i = 0 ; i < n ; i++){ for(int j = 1 ; j < SZ(E[i]) ; j++){ nxt[E[i][j]] = (E[i][0] ^ 1); } nxt[E[i][0]] = (E[i][1 % SZ(E[i])] ^ 1); } for(int i : E[p]){ valid[i] = 1; } for(int i = 0 ; i < 2 * m ; i++){ adj[nxt[i]].push_back(i); // cout << i << sep << nxt[i] << endl; } for(int i = 0 ; i < 2 * m ; i++){ if(comp[i] != -1) continue; vec.clear(); PreDFS(i); int v = vec[0]; while(comp[v] == -1){ comp[v] = i; cycle[i].push_back(v); v = nxt[v]; } for(int j = 0 ; j < SZ(cycle[i]) ; j++){ vec.clear(); DFS(cycle[i][j] , i , j , 0); } } for(int i = 0 ; i < Q ; i++){ int k = G[i] - 1 , ans = 0; for(int j = 0 ; j < n ; j++){ int e = first[j]; if(H[e] <= k){ int x = cycle[comp[e]][(k - H[e] + ind[e]) % SZ(cycle[comp[e]])]; ans += valid[x]; // cout << j << sep << e << sep << x << sep << valid[x] << endl; } else{ // cout << "Debug " << j << endl; for(int x : par[e]){ if(H[e] - x == k){ ans++; } } } } // cout << ans << endl; answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...