제출 #970021

#제출 시각아이디문제언어결과실행 시간메모리
970021lurhx경주 (Race) (IOI11_race)C++17
21 / 100
3039 ms48460 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define mp make_pair #define f first #define s second const ll inf = 1e18; vector<vector<pair<ll,ll>>> edges; vector<bool> centroids; vector<ll> sizes; ll n,k; ll get_size(ll node, ll parent = -1) { ll res = 1; for(auto i: edges[node]) { if(centroids[i.f] || i.f==parent)continue; res+=get_size(i.f,node); } return sizes[node]=res; } ll get_centroid(ll node,ll _n,ll parent = -1) { for(auto i: edges[node]) { if(centroids[i.f] || i.f == parent)continue; if(sizes[i.f]*2>_n) return get_centroid(i.f,_n,node); } return node; } vector<unordered_map<ll,ll>>dp; void dfs(ll node,ll val,ll times,ll parent = -1) { if(dp.back().find(val)==dp.back().end()) dp.back()[val] = times; else dp.back()[val] = min(dp.back()[val],times); for(auto i: edges[node]) { if(i.f==parent || centroids[i.f]) continue; dfs(i.f,val+i.s,times+1,node); } } ll solve(ll node,int _n) { //find centroid; dp.clear(); get_size(node); ll centroid = get_centroid(node,_n); centroids[centroid] = true; for(auto i: edges[centroid]) { dp.emplace_back(); dfs(i.f,i.s,1); } ll ans = inf; for(int i = 0; i<dp.size(); i++) { if(dp[i].find(k)!=dp.back().end()) ans = min(ans,dp[i][k]); for(int j = i+1; j<dp.size(); j++) { for(auto q: dp[i]) { if(dp[j].find(k-q.f)!=dp[j].end()) ans = min(ans,q.s+dp[j][k-q.f]); } } } //cout << dp.size() << endl; for(auto i: edges[centroid]) { if(!centroids[i.f]) ans = min(ans,solve(i.f,sizes[i.f])); } return ans; } int best_path(int N, int K, int H[][2], int L[]){ n = N; k = K; edges.resize(n); sizes.resize(n); centroids.resize(n); pair<ll,ll> in[n]; ll len[n]; for(int i = 0; i<n-1; i++) { in[i].f = H[i][0]; in[i].s = H[i][1]; len[i] = L[i]; edges[in[i].f].emplace_back(in[i].s,len[i]); edges[in[i].s].emplace_back(in[i].f,len[i]); } ll _ = solve(0,n); if(_ == inf) _ =-1; return _; } /* int main() { cin >> n >> k; edges.resize(n); sizes.resize(n); centroids.resize(n); pair<int,int> in[n]; int len[n]; for(int i = 0; i<n-1; i++) { cin >> in[i].f >> in[i].s >> len[i]; edges[in[i].f].emplace_back(in[i].s,len[i]); edges[in[i].s].emplace_back(in[i].f,len[i]); } auto _ = solve(0); if(_ == inf) _ =-1; cout << _; }*/

컴파일 시 표준 에러 (stderr) 메시지

race.cpp: In function 'long long int solve(long long int, int)':
race.cpp:52:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::unordered_map<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |     for(int i = 0; i<dp.size(); i++) {
      |                    ~^~~~~~~~~~
race.cpp:55:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::unordered_map<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |         for(int j = i+1; j<dp.size(); j++) {
      |                          ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...