Submission #1271697

#TimeUsernameProblemLanguageResultExecution timeMemory
1271697ian_otoniRace (IOI11_race)C++20
Compilation error
0 ms0 KiB
#include<bits/stdc++.h> #include "race.h" using namespace std; #define INF 999999999 int calcula_tam_subarvores(int nodo, int pai, vector<vector<pair<int, int>>> &adj, vector<int> &sub, vector<bool> &is_removed){ sub[nodo] = 1; for(auto &p : adj[nodo]){ int filho = p.first; if(filho!=pai && !is_removed[filho]) sub[nodo] += calcula_tam_subarvores(filho, nodo, adj, sub, is_removed); } return sub[nodo]; } int acha_centroide(int nodo, int pai, int n, vector<vector<pair<int, int>>> &adj, vector<int> &sub, vector<bool> &is_removed){ for(auto &p : adj[nodo]){ int filho = p.first; if(filho!=pai && !is_removed[filho] && sub[filho]>n/2) return acha_centroide(filho, nodo, n, adj, sub, is_removed); } return nodo; } int ans = INF; int flag = 1; void dfs1(int start_node, int parent_node, vector<vector<pair<int, int>>> &adj, vector<pair<int, int>> &melhor, int k, vector<bool> &is_removed){ stack<tuple<int, int, int, int>> st; //nodo, pai, distancia e peso int initial_weight = 0; for(auto &edge : adj[start_node]){ if(edge.first==parent_node){ initial_weight = edge.second; break; } } st.push(make_tuple(start_node, parent_node, 1, initial_weight)); //coloca determinado filho do centroide na pilha while(!st.empty()){ int node, pai, distancia_da_raiz, peso_ate_araiz; tie(node, pai, distancia_da_raiz, peso_ate_araiz) = st.top(); st.pop(); //precisamos ver se existe caminho de custo k-peso_ate_araiz que termina na raiz atual int weight_needed = k-peso_ate_araiz; if(weight_needed>=0 && weight_needed<melhor.size()){ //nao negativo if(melhor[weight_needed].second==flag){ ans = min(ans, melhor[weight_needed].first+distancia_da_raiz); } } //agora colocar os filhos na pilha for(auto &p:adj[node]){ int filho = p.first; if(filho!=pai && !is_removed[filho]){ st.push(make_tuple(filho, node, distancia_da_raiz+1, peso_ate_araiz+p.second)); } } } } void dfs2(int start_node, int parent_node, vector<vector<pair<int, int>>> &adj, vector<pair<int, int>> &melhor, int k, vector<bool> &is_removed){ stack<tuple<int, int, int, int>> st; //nodo, pai, distancia e peso int initial_weight = 0; for(auto &edge : adj[start_node]){ if(edge.first==parent_node){ initial_weight = edge.second; break; } } st.push(make_tuple(start_node, parent_node, 1, initial_weight)); //coloca determinado filho do centroide na pilha while(!st.empty()){ int node, pai, distancia_da_raiz, peso_ate_araiz; tie(node, pai, distancia_da_raiz, peso_ate_araiz) = st.top(); st.pop(); if(peso_ate_araiz<0 || peso_ate_araiz>k){ continue; } //salva os caminhos que comecam na raiz e terminam em vertices dessa subarvore if(melhor[peso_ate_araiz].second==flag){ melhor[peso_ate_araiz].first = min(melhor[peso_ate_araiz], distancia_da_raiz); }else{ //primeira vez que este peso aparece melhor[peso_ate_araiz] = {distancia_da_raiz, flag}; } //agora colocar os filhos na pilha for(auto &p:adj[node]){ int filho = p.first; if(filho!=pai && !is_removed[filho]){ st.push(make_tuple(filho, node, distancia_da_raiz+1, peso_ate_araiz+p.second)); } } } } void resolve(vector<vector<pair<int, int>>> &adj, vector<pair<int, int>> &melhor, int nodo, int k, vector<bool> &is_removed){ vector<int> sub(adj.size(), 0); calcula_tam_subarvores(nodo, -1, adj, sub, is_removed); int centroid = acha_centroide(nodo, -1, sub[nodo], adj, sub, is_removed); melhor[0] = {0, flag}; //so fica no centroid e nao anda for(auto &p : adj[centroid]){ int filho = p.first; if (!is_removed[filho]){ dfs1(filho, centroid, adj, melhor, k, is_removed); dfs2(filho, centroid, adj, melhor, k, is_removed); } } is_removed[centroid] = true; flag++; for(auto &p : adj[centroid]){ int filho = p.first; if(!is_removed[filho]){ resolve(adj, melhor, filho, k, is_removed); } } return; } int best_path(int N, int K, int H[][2], int L[]) { ans = INF; vector<vector<pair<int, int>>> adj(N); for (int i = 0; i < N - 1; i++) { int u = H[i][0]; int v = H[i][1]; int w = L[i]; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } vector<bool> is_removed(N, false); vector<pair<int, int>> melhor(k+10, {0, 0}); resolve(adj, melhor, 0, K, is_removed); if(ans == INF){ return -1; }else{ return ans; } }

Compilation message (stderr)

race.cpp: In function 'void dfs2(int, int, std::vector<std::vector<std::pair<int, int> > >&, std::vector<std::pair<int, int> >&, int, std::vector<bool>&)':
race.cpp:92:47: error: no matching function for call to 'min(__gnu_cxx::__alloc_traits<std::allocator<std::pair<int, int> >, std::pair<int, int> >::value_type&, int&)'
   92 |             melhor[peso_ate_araiz].first = min(melhor[peso_ate_araiz], distancia_da_raiz);
      |                                            ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/13/algorithm:60,
                 from /usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h:51,
                 from race.cpp:1:
/usr/include/c++/13/bits/stl_algobase.h:233:5: note: candidate: 'template<class _Tp> constexpr const _Tp& std::min(const _Tp&, const _Tp&)'
  233 |     min(const _Tp& __a, const _Tp& __b)
      |     ^~~
/usr/include/c++/13/bits/stl_algobase.h:233:5: note:   template argument deduction/substitution failed:
race.cpp:92:47: note:   deduced conflicting types for parameter 'const _Tp' ('std::pair<int, int>' and 'int')
   92 |             melhor[peso_ate_araiz].first = min(melhor[peso_ate_araiz], distancia_da_raiz);
      |                                            ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/13/bits/stl_algobase.h:281:5: note: candidate: 'template<class _Tp, class _Compare> constexpr const _Tp& std::min(const _Tp&, const _Tp&, _Compare)'
  281 |     min(const _Tp& __a, const _Tp& __b, _Compare __comp)
      |     ^~~
/usr/include/c++/13/bits/stl_algobase.h:281:5: note:   template argument deduction/substitution failed:
race.cpp:92:47: note:   deduced conflicting types for parameter 'const _Tp' ('std::pair<int, int>' and 'int')
   92 |             melhor[peso_ate_araiz].first = min(melhor[peso_ate_araiz], distancia_da_raiz);
      |                                            ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/13/algorithm:61:
/usr/include/c++/13/bits/stl_algo.h:5775:5: note: candidate: 'template<class _Tp> constexpr _Tp std::min(initializer_list<_Tp>)'
 5775 |     min(initializer_list<_Tp> __l)
      |     ^~~
/usr/include/c++/13/bits/stl_algo.h:5775:5: note:   template argument deduction/substitution failed:
race.cpp:92:47: note:   'std::pair<int, int>' is not derived from 'std::initializer_list<_Tp>'
   92 |             melhor[peso_ate_araiz].first = min(melhor[peso_ate_araiz], distancia_da_raiz);
      |                                            ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/13/bits/stl_algo.h:5785:5: note: candidate: 'template<class _Tp, class _Compare> constexpr _Tp std::min(initializer_list<_Tp>, _Compare)'
 5785 |     min(initializer_list<_Tp> __l, _Compare __comp)
      |     ^~~
/usr/include/c++/13/bits/stl_algo.h:5785:5: note:   template argument deduction/substitution failed:
race.cpp:92:47: note:   'std::pair<int, int>' is not derived from 'std::initializer_list<_Tp>'
   92 |             melhor[peso_ate_araiz].first = min(melhor[peso_ate_araiz], distancia_da_raiz);
      |                                            ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
race.cpp: In function 'int best_path(int, int, int (*)[2], int*)':
race.cpp:149:35: error: 'k' was not declared in this scope
  149 |     vector<pair<int, int>> melhor(k+10, {0, 0});
      |                                   ^