Submission #318932

#TimeUsernameProblemLanguageResultExecution timeMemory
318932alextodoranJob Scheduling (IOI19_job)C++17
0 / 100
30 ms29164 KiB
/** ____ ____ ____ ____ ____ ||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 d, u; }; Cost cost[N_MAX]; int parent[N_MAX]; vector <int> sons[N_MAX]; bool operator < (const Cost &a, const Cost &b) { return a.d * b.u < b.d * a.u; } struct Node { int u; Cost c; }; bool operator < (const Node &u, const Node &v) { return make_pair(u.c, u.u) > make_pair(v.c, v.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); } 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; 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; cost[u].d += cost[v].d; cost[u].u += cost[v].u; mergeSets(&notJoined[u], &notJoined[v]); } } int order[N_MAX]; int curr; void solveOne (int u) { order[++curr] = u; vector <pair <Cost, int> > aux; for(int v : sons[u]) if(isRoot[v] == false) aux.push_back(make_pair(cost[v], v)); sort(aux.begin(), aux.end()); for(pair <Cost, int> p : aux) solveOne(p.second); } void solveAll (int u) { solveOne(u); vector <int> aux; while(notJoined[u].empty() == false) { int v = notJoined[u].begin()->u; notJoined[u].erase(notJoined[u].begin()); aux.push_back(v); } reverse(aux.begin(), aux.end()); for(int v : aux) solveAll(v); } ll 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{d[i - 1], u[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]; assert(i == j); currTime += d[j - 1]; ans += 1LL * currTime * u[j - 1]; } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...