結果
| 問題 |
No.877 Range ReLU Query
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-09-06 22:45:55 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 329 ms / 2,000 ms |
| コード長 | 2,495 bytes |
| コンパイル時間 | 2,500 ms |
| コンパイル使用メモリ | 184,648 KB |
| 実行使用メモリ | 17,432 KB |
| 最終ジャッジ日時 | 2024-11-08 10:08:46 |
| 合計ジャッジ時間 | 6,831 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 20 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#define rep(i,s,e) for(i64 (i) = (s);(i) < (e);(i)++)
#define all(x) x.begin(),x.end()
#define let auto const
template<typename... Types>
struct dynarr: std::vector<Types...> {
using std::vector<Types...>::vector;
using size_type = typename std::vector<Types...>::size_type;
auto&& operator[](size_type i) { return this->at(i); }
auto&& operator[](size_type i) const { return this->at(i); }
};
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#define rep(i,s,e) for(i64 (i) = (s);(i) < (e);(i)++)
#define all(x) x.begin(),x.end()
#define let auto const
struct segment_tree {
using T = pair<i64, i64>;
T ope(const T& a, const T& b) {
return { a.first + b.first , a.second + b.second };
}
T ide() { return { 0, 0 }; }
i64 n;
vector<T> node;
segment_tree(vector<T> init) {
n = 1;
while(n < init.size()) n *= 2;
node.resize(2 * n);
rep(i, 0, init.size()) node[i + n] = init[i];
for(int i = n - 1; i >= 1;i--) node[i] = ope(node[i * 2], node[i * 2 + 1]);
}
void update(i64 i, T x) {
i += n;
node[i] = x;
while(i > 1) {
i = i / 2;
node[i] = ope(node[i * 2], node[i * 2 + 1]);
}
}
/* [l, r] */
T get(i64 l, i64 r) {
T lx = ide();
T rx = ide();
l += n;
r += n;
while(l < r) {
if(l & 1) { lx = ope(lx, node[l]); }
if(!(r & 1)) { rx = ope(node[r], rx); }
l = (l + 1) >> 1;
r = (r - 1) >> 1;
}
if(l == r) { lx = ope(lx, node[l]); }
return ope(lx, rx);
}
};
int main() {
i64 n, q;
cin >> n >> q;
vector<i64> a(n);
vector<pair<i64, i64>> vec;
vector<pair<i64, i64>> vec2;
rep(i,0,n) cin >> a[i];
rep(i,0,n) vec.push_back({ a[i], i });
rep(i,0,n) vec2.push_back({ a[i], 1 });
segment_tree seg(vec2);
sort(all(vec));
i64 ii = 0;
vector<pair<pair<i64,i64>, pair<i64, i64>>> query;
rep(i,0,q) {
i64 com, l, r, x;
cin >> com >> l >> r >> x;
query.push_back({ {x, i}, { l, r } });
}
vector<i64> ans(q);
sort(all(query));
for(auto qq: query) {
i64 l = qq.second.first;
i64 r = qq.second.second;
i64 x = qq.first.first;
i64 ai = qq.first.second;
while(ii < vec.size() && vec[ii].first - x <= 0) {
i64 i = vec[ii].second;
seg.update(i,{0, 0});
ii++;
}
auto res = seg.get(l - 1, r - 1);
ans[ai] = res.first - res.second * x;
}
rep(i,0,q) {
cout << ans[i] << endl;
}
}