Submission #24032

#TimeUsernameProblemLanguageResultExecution timeMemory
24032jenkhaiTropical Garden (IOI11_garden)C++14
100 / 100
3538 ms49736 KiB
#include "garden.h" #include "gardenlib.h" #include <bits/stdc++.h> using namespace std; typedef pair<int, int> ii; typedef vector<int> vi; typedef vector<ii> vii; vector<vi> adj, F, adj2; vi seen; int C[3]; int N,P; void join(int u, int v) { if(seen[u] == 0) { if(seen[v] == 0) adj[u].push_back(v+N); else adj[u].push_back(v); } else if(seen[u] == 1) { if(seen[v] == 0) adj[u+N].push_back(v+N); else adj[u+N].push_back(v); } } void dfs(int u, int p, int idx) { for(int i=0;i<adj2[u].size();i++) { int v = adj2[u][i]; if(v==p) { C[idx] = F[idx][u]+1; } else if(F[idx][v] == -1){ F[idx][v] = F[idx][u]+1; dfs(v, p, idx); } } } void precompute() { F.assign(2, vi()); for(int i=0;i<2;i++) { F[i].assign(2*N, -1); C[i] = 0; } F[0][P] = 0; dfs(P, P, 0); F[1][P+N] = 0; dfs(P+N, P+N, 1); } vi prev; int solve(int k) { int ans = 0; for(int i=0;i<N;i++) { bool ok = false; for(int j=0;j<2;j++) { if(F[j][i] == -1) continue; else if(F[j][i] == k) { //printf("MATCH: i=%d\n", i); ok = true; } else if(C[j] && k>F[j][i] && (k-F[j][i])%C[j]==0) { //printf("CYCLE: i=%d C[j]=%d\n", i, C[j]); ok = true; } } if(ok) ans++; } return ans; } void count_routes(int _N, int M, int _P, int R[][2], int Q, int G[]) { P = _P; N = _N; adj.assign(2*N, vi()); adj2.assign(2*N, vi()); seen.assign(2*N, 0); for(int i=0;i<M;i++) { int u = R[i][0]; int v = R[i][1]; join(u,v); join(v,u); seen[u]++; seen[v]++; } for(int i=0;i<N;i++) { if(adj[i].size() == 0 && adj[i+N].size() == 1) adj[i].push_back(adj[i+N][0]); if(adj[i].size() == 1 && adj[i+N].size() == 0) adj[i+N].push_back(adj[i][0]); } for(int u=0;u<2*N;u++) { adj2[adj[u][0]].push_back(u); } //for(int i=0;i<N;i++) { // if(adj2[i][0] >= N) printf("%d -> %d'\n", i, adj2[i][0]-N); // else printf("%d -> %d\n", i, adj2[i][0]); //} //for(int i=N;i<2*N;i++) { // if(adj2[i][0] >= N) printf("%d'-> %d'\n", i-N, adj2[i][0]-N); // else printf("%d'-> %d\n", i-N, adj2[i][0]); //} precompute(); for(int q=0;q<Q;q++) { answer(solve(G[q])); } }

Compilation message (stderr)

garden.cpp: In function 'void dfs(int, int, int)':
garden.cpp:24:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<adj2[u].size();i++) {
                 ~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...