結果
問題 | No.777 再帰的ケーキ |
ユーザー |
|
提出日時 | 2018-10-07 04:26:54 |
言語 | Java (openjdk 23) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,704 bytes |
コンパイル時間 | 2,770 ms |
コンパイル使用メモリ | 80,480 KB |
実行使用メモリ | 86,852 KB |
最終ジャッジ日時 | 2024-11-19 05:23:57 |
合計ジャッジ時間 | 25,391 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 28 TLE * 5 |
ソースコード
import java.io.FileNotFoundException;import java.io.PrintWriter;import java.util.Arrays;import java.util.Comparator;import java.util.Scanner;class Main {void run() {Scanner sc = new Scanner(System.in);int N = sc.nextInt();PrintWriter pw = new PrintWriter(System.out);int[][] v = new int[N][3];for (int i = 0; i < N; ++i) {v[i][0] = sc.nextInt();v[i][1] = sc.nextInt();v[i][2] = sc.nextInt();--v[i][0];--v[i][1];}compress(v);Arrays.sort(v, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if (o1[0] != o2[0]) {return Integer.compare(o1[0], o2[0]);} else {return -Integer.compare(o1[1], o2[1]);}}});SegmentTree seg = new SegmentTree(N + 1);for (int i = 0; i < N; ++i) {long val = seg.query(0, v[i][1]);seg.update(v[i][1], val + v[i][2]);}pw.println(seg.query(0, N + 1));pw.close();}void compress(int[][] a) {int n = a.length;int[][] tmp = new int[n][4];for (int i = 0; i < n; ++i) {for (int j = 0; j < a[i].length; ++j) {tmp[i][j] = a[i][j];}tmp[i][3] = i;}Arrays.sort(tmp, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return Integer.compare(o1[0], o2[0]);}});int p = 0;for (int i = 0; i < n; ++i) {if (i + 1 < n && tmp[i][0] != tmp[i + 1][0]) {tmp[i][0] = p++;} else {tmp[i][0] = p;}}Arrays.sort(tmp, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return Integer.compare(o1[1], o2[1]);}});p = 0;for (int i = 0; i < n; ++i) {if (i + 1 < n && tmp[i][1] != tmp[i + 1][1]) {tmp[i][1] = p++;} else {tmp[i][1] = p;}}for (int i = 0; i < n; ++i) {for (int j = 0; j < 3; ++j) {a[tmp[i][3]][j] = tmp[i][j];}}}class SegmentTree {int n;long[] v;public SegmentTree(int n_) {n = 1;while (n < n_) {n *= 2;}v = new long[2 * n - 1];}void update(int k, long val) {k += n - 1;v[k] = Math.max(v[k], val);while (k > 0) {k = (k - 1) / 2;v[k] = Math.max(v[2 * k + 1], v[2 * k + 2]);}}long query(int a, int b) {return query(0, n, a, b, 0);}long query(int l, int r, int a, int b, int k) {if (r <= a || b <= l)return 0;else if (a <= l && r <= b)return v[k];else {return Math.max(query(l, (l + r) / 2, a, b, 2 * k + 1), query((l + r) / 2, r, a, b, 2 * k + 2));}}}void tr(Object... objects) {System.out.println(Arrays.deepToString(objects));}public static void main(String[] args) throws FileNotFoundException {new Main().run();}}