結果
問題 | No.877 Range ReLU Query |
ユーザー | SSRS |
提出日時 | 2021-12-18 18:46:27 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 314 ms / 2,000 ms |
コード長 | 1,574 bytes |
コンパイル時間 | 1,993 ms |
コンパイル使用メモリ | 181,908 KB |
実行使用メモリ | 9,848 KB |
最終ジャッジ日時 | 2024-11-08 10:40:07 |
合計ジャッジ時間 | 6,611 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 3 ms
5,248 KB |
testcase_02 | AC | 3 ms
5,248 KB |
testcase_03 | AC | 4 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 3 ms
5,248 KB |
testcase_07 | AC | 3 ms
5,248 KB |
testcase_08 | AC | 4 ms
5,248 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 3 ms
5,248 KB |
testcase_11 | AC | 307 ms
9,408 KB |
testcase_12 | AC | 273 ms
9,200 KB |
testcase_13 | AC | 219 ms
7,492 KB |
testcase_14 | AC | 231 ms
8,596 KB |
testcase_15 | AC | 314 ms
9,784 KB |
testcase_16 | AC | 298 ms
9,668 KB |
testcase_17 | AC | 303 ms
9,848 KB |
testcase_18 | AC | 300 ms
9,732 KB |
testcase_19 | AC | 311 ms
9,616 KB |
testcase_20 | AC | 312 ms
9,620 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; struct binary_indexed_tree{ int N; vector<long long> BIT; binary_indexed_tree(vector<int> A){ N = A.size(); BIT = vector<long long>(N + 1, 0); for (int i = 0; i < N; i++){ BIT[i + 1] = A[i]; } for (int i = 1; i < N; i++){ if (i + (i & -i) <= N){ BIT[i + (i & -i)] += BIT[i]; } } } void add(int i, int x){ i++; while (i <= N){ BIT[i] += x; i += i & -i; } } long long sum(int i){ long long ans = 0; while (i > 0){ ans += BIT[i]; i -= i & -i; } return ans; } long long sum(int L, int R){ return sum(R) - sum(L); } }; int main(){ int N, Q; cin >> N >> Q; vector<int> a(N); for (int i = 0; i < N; i++){ cin >> a[i]; } vector<int> l(Q), r(Q), x(Q); for (int i = 0; i < Q; i++){ int t; cin >> t >> l[i] >> r[i] >> x[i]; l[i]--; } binary_indexed_tree BIT1(a), BIT2(vector<int>(N, 1)); vector<tuple<int, int, int>> T; for (int i = 0; i < N; i++){ T.push_back(make_tuple(a[i], 0, i)); } for (int i = 0; i < Q; i++){ T.push_back(make_tuple(x[i], 1, i)); } sort(T.begin(), T.end()); vector<long long> ans(Q); for (int i = 0; i < N + Q; i++){ int X = get<0>(T[i]); int t = get<1>(T[i]); int id = get<2>(T[i]); if (t == 0){ BIT1.add(id, -a[id]); BIT2.add(id, -1); } if (t == 1){ ans[id] = BIT1.sum(l[id], r[id]) - BIT2.sum(l[id], r[id]) * X; } } for (int i = 0; i < Q; i++){ cout << ans[i] << endl; } }