이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "roads.h"
#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pll pair<ll, ll>
using namespace std;
const int mxN=100010;
int N;
vector <pll> v[mxN], ch[mxN];
vector <ll> seg[mxN], d[mxN];
int sub[mxN];
int u[mxN], dd[mxN];
void dfs0(int now, int pre)
{
sub[now]=1;
for(auto [nxt, x] : v[now]) if(nxt!=pre)
{
dfs0(nxt, now);
ch[now].emplace_back(nxt, x);
sub[now]+=sub[nxt];
}
if(ch[now].empty())
{
u[now]=dd[now]=now;
return;
}
sort(ch[now].begin(), ch[now].end(), [](pll a, pll b){return sub[a.fi]>sub[b.fi];});
dd[now]=dd[ch[now][0].fi];
u[dd[now]]=now;
}
void dfs1(int now)
{
d[now].resize(ch[now].size()+1);
seg[now].resize(sub[now]+1);
if(ch[now].empty())
{
return;
}
for(auto [nxt, x] : ch[now]) dfs1(nxt);
for(int i=1;i<=sub[now];i++)
{
for(auto [nxt, x] : v[now])
{
if(sub[nxt]<i) seg[now][i]+=seg[nxt][sub[nxt]];
else seg[now][i]+=seg[nxt][i];
}
}
for(int i=1;i<=sub[now];i++)
{
vector <ll> pq;
for(auto [nxt, x] : ch[now])
{
if(ch[nxt].size()<i) pq.push_back(x);
else if(x-d[nxt][i]>0) pq.push_back(x-d[nxt][i]);
}
sort(pq.begin(), pq.end(), [](ll a, ll b){return a>b;});
if(i<=ch[now].size() && pq.size()>=i) d[now][i]=pq[i-1];
ll sum=0;
for(int j=0;j<min((int)pq.size(), i);j++) sum+=pq[j];
seg[now][i]+=sum;
}
}
vector<long long> minimum_closure_costs(int n, vector<int> U, vector<int> V, vector<int> W)
{
N=n;
for(int i=0;i<N-1;i++)
{
U[i]++;
V[i]++;
v[U[i]].emplace_back(V[i], W[i]);
v[V[i]].emplace_back(U[i], W[i]);
}
dfs0(1, -1);
//for(int i=1;i<=N;i++) printf("u[%d]=%d\n", i, u[i]);
dfs1(1);
//for(int i=1;i<=N;i++) for(int j=1;j<d[i].size();j++) printf("d[%d][%d]=%lld\n", i, j, d[i][j]);
vector <ll> ans;
ans.resize(N);
ll sum=0;
for(int ele : W) sum+=ele;
ans[0]=sum;
for(int i=1;i<N;i++) ans[i]=sum-seg[1][i];
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
roads.cpp: In function 'void dfs1(int)':
roads.cpp:54:30: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
54 | if(ch[nxt].size()<i) pq.push_back(x);
| ~~~~~~~~~~~~~~^~
roads.cpp:58:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
58 | if(i<=ch[now].size() && pq.size()>=i) d[now][i]=pq[i-1];
| ~^~~~~~~~~~~~~~~~
roads.cpp:58:42: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
58 | if(i<=ch[now].size() && pq.size()>=i) d[now][i]=pq[i-1];
| ~~~~~~~~~^~~
# | 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... |