Submission #1262764

#TimeUsernameProblemLanguageResultExecution timeMemory
1262764uranium235trapezoid (balkan11_trapezoid)Java
25 / 100
834 ms118324 KiB
//package ojuz; import java.io.*; import java.util.*; public class trapezoid { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(reader.readLine()); int[][] traps = new int[n][]; Set<Integer> all = new HashSet<>(n); for (int i = 0; i < n; i++) { String[] line = reader.readLine().split(" "); int a = Integer.parseInt(line[0]), b = Integer.parseInt(line[1]), c = Integer.parseInt(line[2]), d = Integer.parseInt(line[3]); all.add(a); all.add(b); all.add(c); all.add(d); traps[i] = new int[] { a, b, c, d, i }; } int[][] alt = traps.clone(); Integer[] arr = all.toArray(new Integer[0]); Arrays.sort(arr); Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < arr.length; i++) map.put(arr[i], i); for (int[] a : traps) for (int i = 0; i < 4; i++) a[i] = map.get(a[i]); Arrays.sort(traps, Comparator.comparingInt(i -> i[0])); Arrays.sort(alt, Comparator.comparingInt(i -> i[1])); SegTree tree = new SegTree(4 * n); int ptr = 0; int[] x = new int[n], y = new int[n]; int[] temp = new int[2]; for (int[] trap : traps) { while (ptr < n && alt[ptr][1] < trap[0]) { int idx = alt[ptr][4]; tree.upd(alt[ptr][3], x[idx], y[idx]); ptr++; } tree.qry(0, trap[2] + 1, temp); x[trap[4]] = temp[0] + 1; y[trap[4]] = temp[1]; } int l = -1, r = -1; for (int i = 0; i < n; i++) { if (l > x[i]) continue; if (l == x[i]) r = (r + y[i]) % 30013; else r = y[i]; l = Math.max(l, x[i]); } System.out.println(l + " " + r); } static class SegTree { public final int[] a, b; public final int n; public SegTree(int n) { this.n = n; this.a = new int[2 * n]; this.b = new int[2 * n]; Arrays.fill(b, 1); } public void upd(int i, int x, int y) { for (a[i += n] = x, b[i] = y; i > 1; i /= 2) { a[i / 2] = Math.max(a[i], a[i ^ 1]); if (a[i] == a[i ^ 1]) b[i / 2] = (b[i] + b[i ^ 1]) % 30013; else if (a[i] > a[i ^ 1]) b[i / 2] = b[i]; else b[i / 2] = b[i ^ 1]; } } public void qry(int l, int r, int[] ret) { Arrays.fill(ret, -1); for (l += n, r += n; l < r; l /= 2, r /= 2) { if (l % 2 == 1) merge(ret, l++); if (r % 2 == 1) merge(ret, --r); } } public void merge(int[] ret, int i) { if (ret[0] == a[i]) ret[1] = (ret[1] + b[i]) % 30013; else if (ret[0] < a[i]) ret[1] = b[i]; ret[0] = Math.max(ret[0], a[i]); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...