結果
問題 | No.335 門松宝くじ |
ユーザー | 37zigen |
提出日時 | 2017-02-23 18:17:47 |
言語 | Java21 (openjdk 21) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,935 bytes |
コンパイル時間 | 2,149 ms |
コンパイル使用メモリ | 78,408 KB |
実行使用メモリ | 58,640 KB |
最終ジャッジ日時 | 2024-06-10 20:58:12 |
合計ジャッジ時間 | 7,244 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 100 ms
52,576 KB |
testcase_01 | AC | 105 ms
52,932 KB |
testcase_02 | AC | 120 ms
53,996 KB |
testcase_03 | AC | 117 ms
53,856 KB |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | AC | 491 ms
58,184 KB |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
ソースコード
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, j + 1); int minV = -min.query(i, j + 1); if (maxV > Math.max(E[m][i], E[m][j])) { e = Math.max(e, maxV); } if (minV < Math.min(E[m][i], E[m][j])) { e = Math.min(e, minV); } 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 class RMQ { int n = 1; int[] val; 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 -Integer.MAX_VALUE / 10; } 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)); } }