답안 #866438

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
866438 2023-10-26T07:29:53 Z SorahISA Job Scheduling (IOI19_job) C++17
19 / 100
312 ms 32664 KB
#include "job.h"
#include <bits/stdc++.h>
using namespace std;

using int64 = long long;

struct Job {
    int64 u, d, id;
    Job(int64 _u, int64 _d, int64 _id) : u(_u), d(_d), id(_id) {}
    bool operator < (const Job &rhs) const {
        return d * rhs.u < rhs.d * u;
    }
};

int64 scheduling_cost(vector<int> p, vector<int> u, vector<int> d) {
    int N = p.size();
    vector<vector<int>> ch(N);
    for (int i = 1; i < N; ++i) ch[p[i]].emplace_back(i);
    
    multiset<Job> jobs;
    for (int i = 0; i < N; ++i) jobs.emplace(u[i], d[i], i);
    
    int64 tim = 0, ans = 0;
    while (jobs.size()) {
        
        Job job = *begin(jobs);
        jobs.erase(begin(jobs));
        
        // cerr << "(" << job.u << ", " << job.d << ", " << job.id << ")\n";
        if (u[job.id] != job.u or d[job.id] != job.d) continue;
        // cerr << "(" << job.u << ", " << job.d << ", " << job.id << ")\n";
        
        if (p[job.id] == -1) {
            ans += job.u * (tim += job.d);
            for (int x : ch[job.id]) p[x] = -1;
            ch[job.id].clear(), ch[job.id].shrink_to_fit();
        }
        else {
            ans -= u[p[job.id]] * job.d;
            int64 new_u = u[p[job.id]] + job.u;
            int64 new_d = d[p[job.id]] + job.d;
            
            if (ch[p[job.id]].size() <= ch[job.id].size()) {
                u[job.id] = new_u, d[job.id] = new_d;
                for (int x : ch[p[job.id]]) {if (x != job.id) ch[job.id].emplace_back(x), p[x] = job.id;}
                ch[p[job.id]].clear(), ch[p[job.id]].shrink_to_fit();
                if (p[p[job.id]] != -1) ch[p[p[job.id]]].emplace_back(job.id);
                p[job.id] = p[p[job.id]];
                jobs.emplace(u[job.id], d[job.id], job.id);
            }
            else {
                u[p[job.id]] = new_u, d[p[job.id]] = new_d;
                for (int x : ch[job.id]) ch[p[job.id]].emplace_back(x), p[x] = p[job.id];
                ch[job.id].clear(), ch[job.id].shrink_to_fit();
                jobs.emplace(u[p[job.id]], d[p[job.id]], p[job.id]);
            }
        }
    }
    
    return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 123 ms 22984 KB Output is correct
5 Correct 135 ms 22980 KB Output is correct
6 Correct 117 ms 22980 KB Output is correct
7 Correct 131 ms 23108 KB Output is correct
8 Correct 124 ms 23136 KB Output is correct
9 Correct 129 ms 23080 KB Output is correct
10 Correct 121 ms 23080 KB Output is correct
11 Correct 121 ms 22920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 5 ms 1372 KB Output is correct
6 Correct 122 ms 23116 KB Output is correct
7 Correct 173 ms 22960 KB Output is correct
8 Correct 128 ms 22980 KB Output is correct
9 Correct 134 ms 23020 KB Output is correct
10 Correct 0 ms 344 KB Output is correct
11 Correct 1 ms 604 KB Output is correct
12 Correct 4 ms 1372 KB Output is correct
13 Correct 4 ms 1372 KB Output is correct
14 Correct 121 ms 23112 KB Output is correct
15 Correct 117 ms 22980 KB Output is correct
16 Correct 121 ms 22980 KB Output is correct
17 Correct 116 ms 22980 KB Output is correct
18 Correct 119 ms 23024 KB Output is correct
19 Correct 115 ms 23112 KB Output is correct
20 Correct 153 ms 23036 KB Output is correct
21 Correct 134 ms 23272 KB Output is correct
22 Correct 120 ms 22888 KB Output is correct
23 Correct 124 ms 23092 KB Output is correct
24 Correct 118 ms 22980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 544 KB Output is correct
2 Incorrect 312 ms 32664 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Incorrect 0 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -