結果
問題 | No.335 門松宝くじ |
ユーザー | 37zigen |
提出日時 | 2017-02-23 18:38:28 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 960 ms / 2,000 ms |
コード長 | 2,542 bytes |
コンパイル時間 | 2,220 ms |
コンパイル使用メモリ | 78,692 KB |
実行使用メモリ | 61,328 KB |
最終ジャッジ日時 | 2024-06-10 20:59:07 |
合計ジャッジ時間 | 10,728 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 124 ms
53,868 KB |
testcase_01 | AC | 126 ms
53,904 KB |
testcase_02 | AC | 128 ms
54,244 KB |
testcase_03 | AC | 132 ms
54,180 KB |
testcase_04 | AC | 135 ms
53,984 KB |
testcase_05 | AC | 487 ms
58,976 KB |
testcase_06 | AC | 561 ms
60,920 KB |
testcase_07 | AC | 715 ms
60,980 KB |
testcase_08 | AC | 744 ms
61,256 KB |
testcase_09 | AC | 904 ms
60,772 KB |
testcase_10 | AC | 901 ms
61,328 KB |
testcase_11 | AC | 960 ms
61,180 KB |
testcase_12 | AC | 902 ms
61,096 KB |
testcase_13 | AC | 906 ms
60,940 KB |
ソースコード
import java.util.ArrayDeque; import java.util.Arrays; import java.util.Scanner; class Main { static int N; static int M; static int[][] E; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); M = sc.nextInt(); E = new int[M][N]; for (int i = 0; i < M; ++i) { for (int j = 0; j < N; ++j) { E[i][j] = sc.nextInt(); } } double[] expectedValue = new double[M]; for (int m = 0; m < M; ++m) { RMQ max = new RMQ(N); RMQ min = new RMQ(N); for (int i = 0; i < N; ++i) { max.setVal(i, E[m][i]); min.setVal(i, -E[m][i]); } for (int i = 0; i < N; ++i) { for (int j = i + 1; j < N; ++j) { double e = 0; int maxV = max.query(i + 1, j - 1); int minV = -min.query(i + 1, j - 1); if (maxV > 0) { e = Math.max(e, score(E[m][i], maxV, E[m][j])); } if (minV < min.INF) e = Math.max(e, score(E[m][i], minV, E[m][j])); maxV = max.query(j + 1, N); minV = -min.query(j + 1, N); if (maxV > 0) e = Math.max(e, score(E[m][i], E[m][j], maxV)); if (minV < min.INF) e = Math.max(e, score(E[m][i], E[m][j], minV)); maxV = max.query(0, i); minV = -min.query(0, i); if (maxV > 0) e = Math.max(e, score(maxV, E[m][i], E[m][j])); if (minV < min.INF) e = Math.max(e, score(minV, E[m][i], E[m][j])); expectedValue[m] += e; } } } int ans = 0; for (int m = 1; m < M; ++m) { if (expectedValue[ans] < expectedValue[m]) { ans = m; } } System.out.println(ans); } static int score(int a, int b, int c) { if (a < b && b < c) return -1; if (a > b && b > c) return -1; return Math.max(Math.max(a, b), c); } static class RMQ { int n = 1; int[] val; int INF = Integer.MAX_VALUE / 10; public RMQ(int n_) { while (n < n_) n *= 2; val = new int[2 * n - 1]; Arrays.fill(val, -1); } void setVal(int k, int v) { k += n - 1; val[k] = v; while (k > 0) { k = (k - 1) / 2; val[k] = Math.max(val[2 * k + 1], val[2 * k + 2]); } } int query(int a, int b) { return query(a, b, 0, n, 0); } int query(int a, int b, int l, int r, int k) { if (b <= l || a >= r) { return -INF; } else if (a <= l && r <= b) { return val[k]; } else { int vl = query(a, b, l, (l + r) / 2, 2 * k + 1); int vr = query(a, b, (l + r) / 2, r, 2 * k + 2); return Math.max(vl, vr); } } } static void tr(Object... objects) { System.out.println(Arrays.deepToString(objects)); } }