Submission #1119516

# Submission time Handle Problem Language Result Execution time Memory
1119516 2024-11-27T05:56:05 Z johu Job Scheduling (CEOI12_jobs) Java 11
75 / 100
1000 ms 30728 KB
import java.io.*;
import java.util.*;

public class jobs {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int d = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        if (m <= 300000) {
            // Use the ArrayList-based implementation for smaller cases
            handleSmallCases(br, n, d, m);
        } else {
            // Use DataInputStream for larger cases to optimize memory and speed
            handleLargeCasesWithDataInputStream(n, d, m);
        }
    }

    private static void handleSmallCases(BufferedReader br, int n, int d, int m) throws IOException {
        List<Pair> a = new ArrayList<>(m + 2);
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= m; i++) {
            a.add(new Pair(Integer.parseInt(st.nextToken()), i));
        }
        a.add(new Pair(1000000000, 0)); // Dummy pair for boundary

        // Sort using built-in sort with natural order
        a.sort(Comparator.naturalOrder());

        int l = 0, r = m;

        while (r - l > 1) {
            int mid = (l + r) / 2;
            int p = 0;

            for (int i = 1; i <= n; i++) {
                if (a.get(p).fr + d < i) {
                    break;
                }
                int cnt = 0;
                while (cnt < mid && p < m && a.get(p).fr <= i) {
                    cnt++;
                    p++;
                }
            }

            if (p >= m) {
                r = mid;
            } else {
                l = mid;
            }
        }

        System.out.println(r);
        StringBuilder sb = new StringBuilder();
        int p = 0;

        for (int i = 1; i <= n; i++) {
            int cnt = 0;
            while (cnt < r && p < m && a.get(p).fr <= i) {
                sb.append(a.get(p).sc).append(" ");
                cnt++;
                p++;
            }
            sb.append("0\n");
        }

        System.out.print(sb);
    }

    private static void handleLargeCasesWithDataInputStream(int n, int d, int m) throws IOException {
        FastInputReader reader = new FastInputReader(System.in);
        int[] fr = new int[m + 1];
        int[] sc = new int[m + 1];

        for (int i = 1; i <= m; i++) {
            fr[i] = reader.nextInt();
            sc[i] = i;
        }

        quickSort(fr, sc, 1, m);

        int l = 0, r = m + 1;

        while (r - l > 1) {
            int mid = (l + r) / 2;
            int p = 1;
            for (int i = 1; i <= n; i++) {
                int cnt = 0;
                while (cnt < mid && p <= m && fr[p] <= i) {
                    cnt++;
                    p++;
                }
            }
            if (p > m) {
                r = mid;
            } else {
                l = mid;
            }
        }

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(r + "\n");

        int p = 1;
        for (int i = 1; i <= n; i++) {
            int cnt = 0;
            while (cnt < r && p <= m && fr[p] <= i) {
                bw.write(sc[p] + " ");
                cnt++;
                p++;
            }
            bw.write("0\n");
        }
        bw.flush();
    }

    private static void quickSort(int[] fr, int[] sc, int low, int high) {
        if (low < high) {
            int pivotIndex = partition(fr, sc, low, high);
            quickSort(fr, sc, low, pivotIndex - 1);
            quickSort(fr, sc, pivotIndex + 1, high);
        }
    }

    private static int partition(int[] fr, int[] sc, int low, int high) {
        int pivot = fr[high];
        int i = low - 1;
        for (int j = low; j < high; j++) {
            if (fr[j] <= pivot) {
                i++;
                swap(fr, sc, i, j);
            }
        }
        swap(fr, sc, i + 1, high);
        return i + 1;
    }

    private static void swap(int[] fr, int[] sc, int i, int j) {
        int tempFr = fr[i];
        fr[i] = fr[j];
        fr[j] = tempFr;

        int tempSc = sc[i];
        sc[i] = sc[j];
        sc[j] = tempSc;
    }

    static class Pair implements Comparable<Pair> {
        int fr, sc;

        Pair(int fr, int sc) {
            this.fr = fr;
            this.sc = sc;
        }

        @Override
        public int compareTo(Pair other) {
            return Integer.compare(this.fr, other.fr);
        }
    }

    static class FastInputReader {
        private final DataInputStream din;
        private final byte[] buffer;
        private int bufferPointer, bytesRead;

        public FastInputReader(InputStream in) {
            din = new DataInputStream(in);
            buffer = new byte[1 << 16]; // 64 KB buffer
            bufferPointer = bytesRead = 0;
        }

        private byte read() throws IOException {
            if (bufferPointer == bytesRead) {
                bytesRead = din.read(buffer, 0, buffer.length);
                bufferPointer = 0;
                if (bytesRead == -1) return -1; // End of stream
            }
            return buffer[bufferPointer++];
        }

        public int nextInt() throws IOException {
            int ret = 0;
            byte c = read();
            while (c <= ' ') c = read(); // Skip whitespace
            boolean neg = (c == '-');
            if (neg) c = read();
            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');
            if (neg) return -ret;
            return ret;
        }
    }
}
# Verdict Execution time Memory Grader output
1 Correct 352 ms 20432 KB Output is correct
2 Correct 343 ms 20488 KB Output is correct
3 Correct 341 ms 20864 KB Output is correct
4 Correct 347 ms 20684 KB Output is correct
5 Correct 328 ms 20656 KB Output is correct
6 Correct 338 ms 20660 KB Output is correct
7 Correct 351 ms 20776 KB Output is correct
8 Correct 322 ms 20536 KB Output is correct
9 Correct 559 ms 24072 KB Output is correct
10 Correct 449 ms 19496 KB Output is correct
11 Correct 500 ms 20780 KB Output is correct
12 Correct 487 ms 28700 KB Output is correct
13 Correct 659 ms 30620 KB Output is correct
14 Partially correct 342 ms 20436 KB Partially correct
15 Partially correct 690 ms 23036 KB Partially correct
16 Partially correct 383 ms 27160 KB Partially correct
17 Partially correct 396 ms 27640 KB Partially correct
18 Incorrect 963 ms 28984 KB Output isn't correct
19 Execution timed out 1029 ms 30728 KB Time limit exceeded
20 Partially correct 410 ms 29292 KB Partially correct