Submission #501184

#TimeUsernameProblemLanguageResultExecution timeMemory
501184dooweyTropical Garden (IOI11_garden)C++14
100 / 100
2616 ms35320 KiB
#include <bits/stdc++.h> #include "garden.h" #include "gardenlib.h" using namespace std; typedef long long ll; typedef pair<int, int> pii; #define fi first #define se second #define mp make_pair const int N = 151515; const int M = N * 2; vector<int> T[N]; int id[M]; int ban[M]; int idx = 0; int n, m, target; int f[M]; // functional graph int ret[N][2]; vector<int> qr; vector<int> res; int vis[M]; vector<int> TE[M]; vector<int> ord; bool cyc[M]; vector<int> lis; void dfs(int u, int par, int ii){ lis.push_back(u); if(ban[u] == false){ int Z; int reach; for(int v = 0 ; v < qr.size(); v ++ ){ Z = qr[v]; if((int)lis.size() - 1 - Z >= 0){ reach = lis[lis.size() - 1 - Z]; } else{ Z -= (int)lis.size() - 1; reach = ord[(ii + Z) % ord.size()]; } if(id[reach] == target){ res[v] ++ ; } } } for(auto x : TE[u]){ if(cyc[x] || par == x) continue; dfs(x, u, ii); } lis.pop_back(); } void count_routes(int _N, int _M, int _P, int R[][2], int Q, int G[]){ n = _N; m = _M; target = _P; for(int i = 0 ; i < Q; i ++ ){ qr.push_back(G[i]); } res.resize(Q); for(int i = 0 ; i < m ; i ++ ){ T[R[i][0]].push_back(R[i][1]); T[R[i][1]].push_back(R[i][0]); } for(int i = 0; i < n; i ++ ){ id[idx] = i; ban[idx] = 0; ret[i][0] = idx; idx ++ ; id[idx] = i; ban[idx] = 1; ret[i][1] = idx; idx ++ ; } int nex; int ban_nex; int node; int rq; for(int i = 0 ; i < idx; i ++ ){ node = id[i]; if(ban[i] == 0){ nex = T[node][0]; ban_nex = (T[nex][0] == node); f[i] = ret[nex][ban_nex]; } else{ if(T[node].size() == 1) nex = T[node][0]; else nex = T[node][1]; ban_nex = (T[nex][0] == node); f[i] = ret[nex][ban_nex]; } TE[f[i]].push_back(i); vis[i] = -1; } int ff; int ni; for(int i = 0 ; i < idx; i ++ ){ ff = i; while(vis[ff] == -1){ vis[ff] = i; ff = f[ff]; } if(vis[ff] == i){ ni = ff; rq = 0; ord.clear(); do{ ord.push_back(ni); cyc[ni]=true; ni = f[ni]; }while(ni != ff); for(int j = 0 ; j < ord.size(); j ++ ){ dfs(ord[j], -1, j); } } } for(int i = 0 ; i < Q; i ++ ){ answer(res[i]); } }

Compilation message (stderr)

garden.cpp: In function 'void dfs(int, int, int)':
garden.cpp:44:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |         for(int v = 0 ; v < qr.size(); v ++ ){
      |                         ~~^~~~~~~~~~~
garden.cpp: In function 'void count_routes(int, int, int, int (*)[2], int, int*)':
garden.cpp:125:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |             for(int j = 0 ; j < ord.size(); j ++ ){
      |                             ~~^~~~~~~~~~~~
garden.cpp:90:9: warning: variable 'rq' set but not used [-Wunused-but-set-variable]
   90 |     int rq;
      |         ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...