이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |