#include "job.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
const int mxN=2e5;
int n;
vector<int> adj[mxN];
vector<ll> p(mxN), u(mxN), d(mxN);
bool was[mxN];
ll ans=0;
struct cmp{
bool operator()(int x, int y) {
return (ll)d[x]*(ll)u[y]>(ll)d[y]*(ll)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) {
assert(x>=0&&x<n);
for(int v:adj[x])
dfs(v), q[x].push(v);
while(!q[x].empty()) {
int y=q[x].top();
if((ll)d[y]*(ll)u[x]>(ll)d[x]*(ll)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].empty())
q[x].push(q[y].top()), q[y].pop();
}
}
ll scheduling_cost(vector<int> p1, vector<int> u1, vector<int> d1) {
for(int i=0; i<n; ++i)
p[i]=(ll)p1[i], u[i]=(ll)u1[i], d[i]=(ll)d1[i];
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 (ll)d[x]*u[y]>(ll)d[y]*u[x];
});
ll t=0LL;
for(int i:j)
t+=d[i], ans+=(ll)u[i]*t;
return ans;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
30 ms |
32108 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
29 ms |
32108 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
29 ms |
32200 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
31 ms |
32364 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
29 ms |
32108 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
30 ms |
32108 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |