This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "job.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
const int mxN=2e5;
int n, dist[mxN];
vector<int> adj[mxN], p(mxN), u(mxN), d(mxN);
bool was[mxN];
ll ans=0;
struct cmp{
bool operator()(int x, int y) {
return d[x]*u[y]>d[y]*u[x];
}
};
priority_queue<int, vector<int>, cmp> q[mxN];
void merge(int x, int y) {
d[x]+=d[y];
u[x]+=u[y];
}
void dfs(int x) {
for(int v:adj[x])
dfs(v), q[x].push(v);
while(!q[x].empty()) {
int y=q[x].top();
if(d[y]*u[x]>d[x]*u[y])
break;
was[y]=true;
q[x].pop();
ans-=d[y]*u[x];
merge(x, y);
if((int)q[x].size()<(int)q[y].size())
swap(q[x], q[y]);
while(!q[y].size())
q[x].push(q[y].top()), q[y].pop();
}
}
ll scheduling_cost(vector<int> p1, vector<int> u1, vector<int> d1) {
p=p1, u=u1, d=d1;
n = (int) p.size();
for(int i=1; i<n; ++i)
adj[p1[i]].pb(i);
dfs(0);
vector<int> j;
for(int i=0; i<n; ++i)
if(!was[i])
j.pb(i);
sort(j.rbegin(), j.rend(), [&](int x, int y) {
return d[x]*u[y]>d[y]*u[x];
});
ll t=0;
for(int i:j)
t+=d[i], ans+=u[i]*t;
return ans;
}
# | 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... |