結果
問題 | No.833 かっこいい電車 |
ユーザー | 37zigen |
提出日時 | 2019-05-24 22:45:31 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 1,783 ms / 2,000 ms |
コード長 | 2,113 bytes |
コンパイル時間 | 2,876 ms |
コンパイル使用メモリ | 77,956 KB |
実行使用メモリ | 71,936 KB |
最終ジャッジ日時 | 2024-07-02 03:46:17 |
合計ジャッジ時間 | 32,221 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1,783 ms
61,348 KB |
testcase_01 | AC | 142 ms
41,612 KB |
testcase_02 | AC | 143 ms
41,400 KB |
testcase_03 | AC | 150 ms
41,924 KB |
testcase_04 | AC | 127 ms
40,048 KB |
testcase_05 | AC | 143 ms
41,608 KB |
testcase_06 | AC | 140 ms
41,340 KB |
testcase_07 | AC | 155 ms
41,744 KB |
testcase_08 | AC | 135 ms
41,060 KB |
testcase_09 | AC | 136 ms
41,396 KB |
testcase_10 | AC | 1,389 ms
61,068 KB |
testcase_11 | AC | 1,642 ms
63,356 KB |
testcase_12 | AC | 838 ms
54,828 KB |
testcase_13 | AC | 704 ms
50,004 KB |
testcase_14 | AC | 1,381 ms
69,340 KB |
testcase_15 | AC | 893 ms
59,252 KB |
testcase_16 | AC | 763 ms
52,156 KB |
testcase_17 | AC | 780 ms
54,176 KB |
testcase_18 | AC | 1,542 ms
61,160 KB |
testcase_19 | AC | 743 ms
52,928 KB |
testcase_20 | AC | 403 ms
49,012 KB |
testcase_21 | AC | 1,395 ms
59,960 KB |
testcase_22 | AC | 976 ms
57,364 KB |
testcase_23 | AC | 777 ms
54,640 KB |
testcase_24 | AC | 963 ms
61,036 KB |
testcase_25 | AC | 1,561 ms
71,936 KB |
testcase_26 | AC | 834 ms
56,496 KB |
testcase_27 | AC | 1,228 ms
58,276 KB |
testcase_28 | AC | 1,005 ms
59,208 KB |
testcase_29 | AC | 1,088 ms
60,856 KB |
testcase_30 | AC | 928 ms
56,604 KB |
testcase_31 | AC | 1,382 ms
61,060 KB |
ソースコード
import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws Exception { new Main().run(); } class SegTree { int n; long[] v; public SegTree(int n_) { n = 1; while (n < n_) n *= 2; v = new long[2 * n - 1]; } void add(int k, long val) { k += n - 1; v[k] += val; while (k > 0) { k = (k - 1) / 2; v[k] = v[2 * k + 1] + v[2 * k + 2]; } } long sum(int a, int b) { return sum(0, n, a, b, 0); } long sum(int l, int r, int a, int b, int k) { if (a <= l && r <= b) return v[k]; else if (b <= l || r <= a) return 0; else { long lv = sum(l, (l + r) / 2, a, b, 2 * k + 1); long rv = sum((l + r) / 2, r, a, b, 2 * k + 2); return lv + rv; } } } void run() throws Exception { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int Q = sc.nextInt(); long[] A = new long[N]; for (int i = 0; i < A.length; ++i) { A[i] = sc.nextLong(); } SegTree seg1 = new SegTree(N); SegTree seg2 = new SegTree(N); for (int i = 0; i < N; ++i) { seg1.v[i + seg1.n - 1] = A[i]; } for (int i = seg1.n - 2; i >= 0; --i) { seg1.v[i] = seg1.v[2 * i + 1] + seg1.v[2 * i + 2]; } for (int i = 0; i < Q; ++i) { int query = sc.nextInt(); int x = sc.nextInt(); --x; if (query == 1) { if (seg2.sum(x, x + 1) == 0) { seg2.add(x, 1); } } else if (query == 2) { if (seg2.sum(x, x + 1) == 1) { seg2.add(x, -1); } } else if (query == 3) { seg1.add(x, 1); } else if (query == 4) { int r_ng = N; int r_ok = x; while (r_ng - r_ok > 1) { int m = (r_ng + r_ok) / 2; if (seg2.sum(x, m) < m - x) { r_ng = m; } else { r_ok = m; } } int l_ok = x;// [x, x) int l_ng = -1; while (l_ok - l_ng > 1) { int m = (l_ng + l_ok) / 2; if (seg2.sum(m, x) < x - m) { l_ng = m; } else { l_ok = m; } } System.out.println(seg1.sum(l_ok, r_ok + 1)); } } } void tr(Object... objects) { System.out.println(Arrays.deepToString(objects)); } }