Submission #318880

# Submission time Handle Problem Language Result Execution time Memory
318880 2020-11-03T12:02:02 Z alextodoran Job Scheduling (IOI19_job) C++17
Compilation error
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(&notJoined[u], &notJoined[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;
}

Compilation message

job.cpp:121:5: error: ambiguating new declaration of 'int scheduling_cost(std::vector<int>, std::vector<int>, std::vector<int>)'
  121 | int scheduling_cost (vector <int> p, vector <int> u, vector <int> d)
      |     ^~~~~~~~~~~~~~~
In file included from job.cpp:10:
job.h:7:11: note: old declaration 'long long int scheduling_cost(std::vector<int>, std::vector<int>, std::vector<int>)'
    7 | long long scheduling_cost(std::vector<int> U, std::vector<int> D, std::vector<int> P);
      |           ^~~~~~~~~~~~~~~