Submission #587050

#TimeUsernameProblemLanguageResultExecution timeMemory
587050MohamedFaresNebiliTropical Garden (IOI11_garden)C++14
100 / 100
2676 ms37404 KiB
#include <bits/stdc++.h> #include "garden.h" #include "gardenlib.h" /// #pragma GCC optimize ("Ofast") /// #pragma GCC target ("avx2") /// #pragma GCC optimize("unroll-loops") using namespace std; using ll = long long; using ii = pair<ll, ll>; using vi = vector<int>; #define ff first #define ss second #define pb push_back #define all(x) (x).begin(), (x).end() #define lb lower_bound const int oo = 1000 * 1000 * 1000 + 7; int C[2], to[300005], D[300005], DD[300005]; int vis[300005], Vis[300005]; vector<int> adj[300005], E[300005]; void solve(int v) { queue<int> Q; Q.push(v); D[v] = 0; int u = v; while(vis[u] == 0) { vis[u] = 1; u = to[u]; } while(vis[u] != 2) { vis[u] = 2; u = to[u]; C[0]++; } if(vis[v] != 2) C[0] = -1; while(!Q.empty()) { int A = Q.front(); Q.pop(); for(auto e : adj[A]) { if(D[e] <= D[A] + 1) continue; D[e] = D[A] + 1; Q.push(e); } } } void Solve(int v) { queue<int> Q; Q.push(v); DD[v] = 0; int u = v; while(Vis[u] == 0) { Vis[u] = 1; u = to[u]; } while(Vis[u] != 2) { Vis[u] = 2; u = to[u]; C[1]++; } if(Vis[v] != 2) C[1] = -1; while(!Q.empty()) { int A = Q.front(); Q.pop(); for(auto e : adj[A]) { if(DD[e] <= DD[A] + 1) continue; DD[e] = DD[A] + 1; Q.push(e); } } } void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) { memset(to, -1, sizeof to); fill(D, D + 2 * N, oo); fill(DD, DD + 2 * N, oo); for(int l = 0; l < M; l++) { int U = R[l][0], V = R[l][1]; if(E[U].size() < 2) E[U].pb(V); if(E[V].size() < 2) E[V].pb(U); } for(int l = 0; l < N; l++) { D[l] = DD[l] = oo; for(int i = 0; i < E[l].size(); i++) { int U = E[l][i]; if(i == 0) { to[l] = U; if(E[U][0] == l && E[U].size() > 1) to[l] = U + N, U += N; adj[U].pb(l); continue; } to[l + N] = U; if(E[U][0] == l && E[U].size() > 1) to[l + N] = U + N, U += N; adj[U].pb(l + N); } } solve(P); Solve(P + N); for(int l = 0; l < Q; l++) { int T = G[l]; int res = 0; for(int i = 0; i < N; i++) { if(C[0] == -1 && D[i] == T) res++; else if(C[0] > 0 && T >= D[i] && (T - D[i]) % C[0] == 0) res++; else if(C[1] == -1 & DD[i] == T) res++; else if(C[1] > 0 && T >= DD[i] && (T - DD[i]) % C[1] == 0) res++; } answer(res); } }

Compilation message (stderr)

garden.cpp: In function 'void count_routes(int, int, int, int (*)[2], int, int*)':
garden.cpp:76:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |                         for(int i = 0; i < E[l].size(); i++) {
      |                                        ~~^~~~~~~~~~~~~
garden.cpp:99:42: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
   99 |                             else if(C[1] == -1 & DD[i] == T) res++;
      |                                     ~~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...