Submission #265460

#TimeUsernameProblemLanguageResultExecution timeMemory
265460R3KTJob Scheduling (CEOI12_jobs)Java
0 / 100
1459 ms65564 KiB
import java.util.*; import java.io.*; public class jobs { // https://oj.uz/problem/view/CEOI12_jobs // TLE && RTE public static void main(String[] args) throws IOException, FileNotFoundException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //BufferedReader in = new BufferedReader(new FileReader("jobs")); StringTokenizer st = new StringTokenizer(in.readLine()); int n = Integer.parseInt(st.nextToken()); int d = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken()); int[] arr = new int[m]; HashMap<Integer, ArrayList<Integer>> map = new HashMap<>(); st = new StringTokenizer(in.readLine()); for (int i=0; i<m; ++i) { arr[i] = Integer.parseInt(st.nextToken()); if (map.containsKey(arr[i])) { map.get(arr[i]).add(i+1); } else { ArrayList<Integer> c = new ArrayList<>(); c.add(i+1); map.put(arr[i], c); } } Arrays.parallelSort(arr); int min=0; int max=m; while (min < max) { int middle = (min + max)/2; //if (check(middle, n, d, map)) { if (check(arr, middle, d, n)) { max = middle; } else min = middle+1; } System.out.println(min); // construct int count=1; for (int i=0; i<m; i+=min) { for (int j=i; j<i+min && j<m; j++) { System.out.print(map.get(arr[j]).get(map.get(arr[j]).size()-1) + " "); map.get(arr[j]).remove(map.get(arr[j]).size()-1); } System.out.println(0); count++; } for (int i=count; i<=n; i++) System.out.println(0); } public static boolean check(int[] arr, int num, int d, int n) { int pointer=0; int m = arr.length; for (int i=1; i<=n; i++) { if (pointer>=m) break; if (i - arr[pointer] > d) return false; pointer += num; } if (pointer < m) return false; return true; } } /* public static boolean check(int num, int n, int d, HashMap<Integer, ArrayList<Integer>> map) { TreeMap<Integer, Integer> cur = new TreeMap<>(); int pointer=1; while (pointer <= n) { if (map.containsKey(pointer)) { cur.put(pointer, map.get(pointer).size()); } else { } int curleft = num; while (cur.size() > 0 && curleft >0) { int k = cur.firstKey(); if (pointer - k > d) return false; if (cur.get(k) <= curleft) { curleft -= cur.get(k); cur.remove(k); } else { cur.put(k, cur.get(k)-curleft); curleft=0; } } pointer++; } if (cur.size() > 0) return false; return true; } */
#Verdict Execution timeMemoryGrader output
Fetching results...