제출 #421015

#제출 시각아이디문제언어결과실행 시간메모리
421015JasiekstrzRoad Closures (APIO21_roads)C++17
14 / 100
607 ms1048580 KiB
#include "roads.h" #include<bits/stdc++.h> #define fi first #define se second using namespace std; const int NN=1e5; const int SQ=300; const long long INF=(long long)1e18+7; vector<pair<int,int>> e[NN+10]; vector<pair<long long,long long>> *dp[NN+10]; // fi - parent destroyed, se - parent not destroyed bool big(int x) { return e[x].size()>SQ; } void dfs(int x,int p,int n) { for(auto v:e[x]) { if(v.fi!=p) dfs(v.fi,x,n); } if(big(x)) { dp[x]=new vector<pair<long long,long long>>(n); vector<long long> tmp; tmp.reserve(e[x].size()); for(int k=0;k<=min(SQ,n-1);k++) { tmp.clear(); (*dp[x])[k].fi=0; for(auto v:e[x]) { if(v.fi==p) continue; (*dp[x])[k].fi+=(*dp[v.fi])[k].fi+v.se; tmp.push_back((*dp[v.fi])[k].se-(*dp[v.fi])[k].fi-v.se); } (*dp[x])[k].se=(*dp[x])[k].fi; sort(tmp.begin(),tmp.end()); while(!tmp.empty() && tmp.back()>0) tmp.pop_back(); for(size_t i=1;i<tmp.size();i++) tmp[i]+=tmp[i-1]; if(!tmp.empty()) { if(k-1>=0) (*dp[x])[k].fi+=tmp[min((int)tmp.size(),k)-1]; if(k-2>=0) (*dp[x])[k].se+=tmp[min((int)tmp.size(),k-1)-1]; } if(k==0) (*dp[x])[k].se=INF; } #warning todo } else { dp[x]=new vector<pair<long long,long long>>(n); vector<long long> tmp; tmp.reserve(e[x].size()); for(int k=0;k<=min(SQ,n-1);k++) { tmp.clear(); (*dp[x])[k].fi=0; for(auto v:e[x]) { if(v.fi==p) continue; (*dp[x])[k].fi+=(*dp[v.fi])[k].fi+v.se; tmp.push_back((*dp[v.fi])[k].se-(*dp[v.fi])[k].fi-v.se); } (*dp[x])[k].se=(*dp[x])[k].fi; sort(tmp.begin(),tmp.end()); while(!tmp.empty() && tmp.back()>0) tmp.pop_back(); for(size_t i=1;i<tmp.size();i++) tmp[i]+=tmp[i-1]; if(!tmp.empty()) { if(k-1>=0) (*dp[x])[k].fi+=tmp[min((int)tmp.size(),k)-1]; if(k-2>=0) (*dp[x])[k].se+=tmp[min((int)tmp.size(),k-1)-1]; } if(k==0) (*dp[x])[k].se=INF; } #warning todo } return; } vector<long long> minimum_closure_costs(int N,vector<int> U,vector<int> V,vector<int> W) { for(int i=0;i<N-1;i++) { e[U[i]].emplace_back(V[i],W[i]); e[V[i]].emplace_back(U[i],W[i]); } dfs(0,-1,N); vector<long long> ans(N); for(int i=0;i<N;i++) ans[i]=(*dp[0])[i].fi; return ans; }

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

roads.cpp:54:4: warning: #warning todo [-Wcpp]
   54 |   #warning todo
      |    ^~~~~~~
roads.cpp:88:4: warning: #warning todo [-Wcpp]
   88 |   #warning todo
      |    ^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...