# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
318880 | 2020-11-03T12:02:02 Z | alextodoran | Job Scheduling (IOI19_job) | C++17 | 0 ms | 0 KB |
/** ____ ____ ____ ____ ____ ||a |||t |||o |||d |||o || ||__|||__|||__|||__|||__|| |/__\|/__\|/__\|/__\|/__\| **/ #include <bits/stdc++.h> #include "job.h" using namespace std; typedef long long ll; const int N_MAX = 200002; int n; struct Cost { int u, d; }; Cost cost[N_MAX]; int parent[N_MAX]; vector <int> sons[N_MAX]; bool operator < (const Cost &a, const Cost &b) { return a.u * b.d < b.u * a.d; } struct Node { int u; Cost c; }; bool operator < (const Node &u, const Node &v) { return make_pair(u.c, u) > make_pair(v.c, u); } set <Node> notJoined[N_MAX]; void mergeSets (set <Node>* in, set <Node>* from) { bool swapped = false; if(in->size() < from->size()) { swap(in, from); swapped = true; } while(from->empty() == false) { in->insert(*from->begin()); from->erase(from->begin()); } if(swapped == true) swap(in, from); } int priority[N_MAX]; bool isRoot[N_MAX]; void dfs (int u) { for(int v : sons[u]) { dfs(v); notJoined[u].insert(Node{v, cost[v]}); } isRoot[u] = true; int curr = 0; priority[u] = ++curr; while(notJoined[u].empty() == false) { int v = notJoined[u].begin()->u; if(cost[u] < cost[v]) break; notJoined[u].erase(notJoined[u].begin()); isRoot[v] = false; priority[v] = ++curr; cost[u].u += cost[v].u; cost[u].d += cost[v].d; mergeSets(¬Joined[u], ¬Joined[v]); } } int order[N_MAX]; int curr; void solveOne (int u) { order[++curr] = u; vector <pair <int, int> > aux; for(int v : sons[u]) if(isRoot[v] == false) aux.push_back(make_pair(priority[v], v)); sort(aux.begin(), aux.end()); for(pair <int, int> p : aux) solveOne(p.second); } void solveAll (int u) { solveOne(u); while(notJoined[u].empty() == false) { int v = notJoined[u].begin()->u; notJoined[u].erase(notJoined[u].begin()); solveAll(v); } } int scheduling_cost (vector <int> p, vector <int> u, vector <int> d) { n = p.size(); for(int i = 1; i <= n; i++) { parent[i] = p[i - 1] + 1; cost[i] = Cost{u[i - 1], d[i - 1]}; } for(int i = 2; i <= n; i++) sons[parent[i]].push_back(i); dfs(1); solveAll(1); int currTime = 0; ll ans = 0; for(int i = 1; i <= n; i++) { int j = order[i]; currTime += d[j - 1]; ans += 1LL * currTime * u[j - 1]; } return ans; }