Submission #318931

# Submission time Handle Problem Language Result Execution time Memory
318931 2020-11-03T12:50:52 Z alextodoran Job Scheduling (IOI19_job) C++17
19 / 100
307 ms 36848 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 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];
        currTime += d[j - 1];
        ans += 1LL * currTime * u[j - 1];
    }
    return ans;
}
# Verdict Execution time Memory Grader output
1 Correct 10 ms 14444 KB Output is correct
2 Incorrect 10 ms 14444 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 14444 KB Output is correct
2 Correct 10 ms 14444 KB Output is correct
3 Correct 11 ms 14444 KB Output is correct
4 Correct 273 ms 36692 KB Output is correct
5 Correct 273 ms 36696 KB Output is correct
6 Correct 264 ms 36696 KB Output is correct
7 Correct 270 ms 36828 KB Output is correct
8 Correct 264 ms 36692 KB Output is correct
9 Correct 262 ms 36700 KB Output is correct
10 Correct 307 ms 35928 KB Output is correct
11 Correct 279 ms 36700 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 14444 KB Output is correct
2 Correct 10 ms 14444 KB Output is correct
3 Correct 10 ms 14444 KB Output is correct
4 Correct 11 ms 14572 KB Output is correct
5 Correct 17 ms 15596 KB Output is correct
6 Correct 255 ms 36696 KB Output is correct
7 Correct 252 ms 36720 KB Output is correct
8 Correct 262 ms 36848 KB Output is correct
9 Correct 249 ms 36696 KB Output is correct
10 Correct 10 ms 14444 KB Output is correct
11 Correct 11 ms 14572 KB Output is correct
12 Correct 17 ms 15596 KB Output is correct
13 Correct 17 ms 15596 KB Output is correct
14 Correct 258 ms 36676 KB Output is correct
15 Correct 257 ms 36696 KB Output is correct
16 Correct 251 ms 36696 KB Output is correct
17 Correct 260 ms 36700 KB Output is correct
18 Correct 255 ms 36696 KB Output is correct
19 Correct 253 ms 36696 KB Output is correct
20 Correct 249 ms 36692 KB Output is correct
21 Correct 251 ms 36824 KB Output is correct
22 Correct 249 ms 36700 KB Output is correct
23 Correct 247 ms 36724 KB Output is correct
24 Correct 250 ms 36676 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 10 ms 14444 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 11 ms 14444 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 14444 KB Output is correct
2 Incorrect 10 ms 14444 KB Output isn't correct
3 Halted 0 ms 0 KB -