結果
| 問題 |
No.877 Range ReLU Query
|
| コンテスト | |
| ユーザー |
lowr
|
| 提出日時 | 2019-09-07 17:36:08 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 868 ms / 2,000 ms |
| コード長 | 1,467 bytes |
| コンパイル時間 | 2,423 ms |
| コンパイル使用メモリ | 199,092 KB |
| 最終ジャッジ日時 | 2025-01-07 17:11:29 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 20 |
ソースコード
#include <bits/stdc++.h>
using i64 = long long;
constexpr int size = 1 << 17;
std::vector<i64> dat[size * 2 - 1], sum[size * 2 - 1];
i64 query(int a, int b, i64 x, int k, int l, int r) {
if (r <= a || b <= l) return 0;
if (a <= l && r <= b) {
int i = std::lower_bound(dat[k].begin(), dat[k].end(), x) - dat[k].begin();
if (i == r - l) return 0;
return sum[k][i] - x * (r - l - i);
}
return query(a, b, x, k * 2 + 1, l, (l + r) / 2) + query(a, b, x, k * 2 + 2, (l + r) / 2, r);
}
void dig(int k, int n) {
if (n == 1) {
if (dat[k].empty()) dat[k].push_back(0);
sum[k].push_back(dat[k][0]);
return;
}
dig(2 * k + 1, n / 2);
dig(2 * k + 2, n / 2);
dat[k].resize(n); sum[k].resize(n);
auto &v = dat[2 * k + 1], &w = dat[2 * k + 2];
for (int i = 0, l = 0, r = 0; i < n; i++) {
if (r == n / 2 || (l != n / 2 && v[l] < w[r])) dat[k][i] = v[l++];
else dat[k][i] = w[r++];
}
sum[k][n - 1] = dat[k][n - 1];
for (int i = n - 2; i >= 0; i--) sum[k][i] = sum[k][i + 1] + dat[k][i];
}
int main() {
int n, q;
std::cin >> n >> q;
for (int i = 0; i < n; i++) {
i64 in;
std::cin >> in;
dat[i + size - 1].push_back(in);
}
dig(0, size);
while (q--) {
int t, l, r;
i64 x;
std::cin >> t >> l >> r >> x;
std::cout << query(l - 1, r, x, 0, 0, size) << std::endl;
}
return 0;
}
lowr