Submission #143429

#TimeUsernameProblemLanguageResultExecution timeMemory
143429model_codeJob Scheduling (IOI19_job)Java
100 / 100
2255 ms115272 KiB
// correct/job-amd.java

import java.util.ArrayList;
import java.util.TreeSet;

class job {
    static final int maxn = 200_000 + 100;
    static long ans = 0L;

    ArrayList<Integer>[] adj = new ArrayList[maxn];
    int[] u = new int[maxn];
    int[] d = new int[maxn];
    int[] p = new int[maxn];

    static class Job implements Comparable<Job> {
        long u, d;
        private Object o;

        Job(int U, int D){
            u = U;
            d = D;
        }
        void merge(Job j) {
            ans += d * j.u;
            u += j.u;
            d += j.d;
        }
        public int compareTo(Job j){ // -1: less that, 0: equal, +1: greater than
            long a = u * j.d;
            long b = j.u * d;
            return Long.compare(a, b);
        }
        public boolean equals(Object o) {
            if(!(o instanceof Job))
                return false;
            Job j = (Job)o;
            return this.compareTo(j) == 0;
        }
    }


    TreeSet<Job>[] se = new TreeSet[maxn];

    int dfs(int v){
        ArrayList<Integer> children = new ArrayList<>();
        int res = v;
        int big = -1; // index in children
        for(int i = 0; i < adj[v].size(); ++ i) {
            int u = adj[v].get(i);
            children.add(dfs(u));
            if (big == -1 || se[children.get(i)].size() > se[children.get(big)].size())
                big = i;
        }
        Job j = new Job(u[v], d[v]);
        if(big == -1){ // leaf
            se[res] = new TreeSet<>();
            se[res].add(j);
            return res;
        }
        res = children.get(big);
        for(int i = 0; i < children.size(); ++ i)
            if(i != big) {
                for(Job jj: se[children.get(i)]) {
                    Job it = se[res].ceiling(jj);
                    if(it != null && jj.compareTo(it) == 0) {
                        jj.merge(it);
                        se[res].remove(it);
                    }
                    se[res].add(jj);
                }
                se[children.get(i)].clear();
            }
        while(!se[res].isEmpty() && j.compareTo(se[res].last()) <= 0) {
            Job last = se[res].last();
            j.merge(last);
            se[res].remove(last);
        }
        se[res].add(j);
        return res;
    }

    public long scheduling_cost(int[] P, int[] U, int[] D) {
        int n = U.length;
        for(int i = 0; i < n; ++ i)
            adj[i] = new ArrayList<>();
        for(int i = 0; i < n; ++ i) {
            u[i] = U[i];
            d[i] = D[i];
            p[i] = P[i];
            ans += (long)u[i] * (long)d[i];
            if (p[i] != -1)
                adj[p[i]].add(i);
        }
        int x = dfs(0);
        long d = 0;
        while(!se[x].isEmpty()) {
            Job j = se[x].last();
            ans += d * j.u;
            d += j.d;
            se[x].remove(j);
        }
        return ans;
    }
}

Compilation message (stderr)

Note: job.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
#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...