Submission #1060833

#TimeUsernameProblemLanguageResultExecution timeMemory
1060833boyliguanhanJob Scheduling (IOI19_job)C++17
100 / 100
291 ms21700 KiB
#include "job.h"
#include <bits/stdc++.h>
using namespace std;
struct dsu{
    int par[1<<18];
    int abp(int n){
        return par[n]?par[n]=abp(par[n]):n;
    }
    void merge(int a,int b){
        a=abp(a+2),b=abp(b+2);
        par[b]=a;
    }
    int comp(int n){
        return abp(n+2)-2;
    }
} DDT;
struct DATA{
    long long timetaken,value,i;
    DATA(long long u,long long d,int ind){
        value=u,timetaken=d,i=ind;
    }
    DATA(){
        timetaken=1e9;
        value=1;
        i=-1;
    }
    friend bool operator<(const DATA &a,const DATA&b){
        return make_pair(a.timetaken*b.value,a.i)<
                make_pair(b.timetaken*a.value,b.i);
    }
};
set<DATA>pq;
long long scheduling_cost(std::vector<int> p, std::vector<int> _u, std::vector<int> _d) {
    vector<long long>u,d;
    int N=p.size();
    long long curtime=0,ans=0;
    for(int i=0;i<N;i++)
        u.push_back(_u[i]),
        d.push_back(_d[i]),
        ans+=u[i]*d[i];
    for(int i=0;i<N;i++)
        pq.insert(DATA(u[i],d[i],i));
    while(pq.size()){
        int i=pq.begin()->i;
        pq.erase(DATA(u[i],d[i],i));
        if(DDT.comp(p[i])==-1){
            ans+=curtime*u[i];
            curtime+=d[i];
            DDT.merge(-1,i);
        } else {
            int mer=DDT.comp(p[i]);
            pq.erase(DATA(u[mer],d[mer],mer));
            DDT.merge(mer,i);
            ans+=d[mer]*u[i];
            u[mer]+=u[i];d[mer]+=d[i];
            pq.insert(DATA(u[mer],d[mer],mer));
        }
    }
    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...