結果

問題 No.1000 Point Add and Array Add
ユーザー 🍮かんプリン
提出日時 2020-02-28 22:36:48
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 4,513 bytes
コンパイル時間 1,415 ms
コンパイル使用メモリ 160,380 KB
最終ジャッジ日時 2024-11-14 22:09:20
合計ジャッジ時間 2,238 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.cpp:32:58: error: invalid use of non-static data member ‘LazySegmentTree<Monoid>::UNITY’
   32 |     LazySegmentTree(int m, Monoid val = LazySegmentTree::UNITY) {
      |                                                          ^~~~~
main.cpp:13:12: note: declared here
   13 |     Monoid UNITY = 0;
      |            ^~~~~

ソースコード

diff #
プレゼンテーションモードにする

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
// RAQ RUQ and RSQ
// verify : https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/2/DSL_2_G
// verify : https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/2/DSL_2_I
template<typename Monoid>
struct LazySegmentTree {
private:
using Func = std::function<Monoid(Monoid, Monoid)>;
Func F = [](Monoid a, Monoid b) { return a + b; };
Monoid UNITY = 0;
int n;
std::vector<Monoid> node, lazy;
std::vector<int> prop; // 1:add 2:update
// propagation
void eval(int k, int l, int r) {
if (prop[k] != 0) {
node[k] = lazy[k] + (prop[k] == 1 ? node[k] : 0);
if (r - l > 1) {
lazy[2 * k + 1] = lazy[k] / 2 + (prop[k] == 1 ? lazy[2 * k + 1] : 0);
lazy[2 * k + 2] = lazy[k] / 2 + (prop[k] == 1 ? lazy[2 * k + 2] : 0);
prop[2 * k + 1] = prop[2 * k + 2] = prop[k];
}
lazy[k] = 0;
prop[k] = 0;
}
}
public:
LazySegmentTree(int m, Monoid val = LazySegmentTree::UNITY) {
n = 1; while (n < m) n <<= 1;
node.resize(n * 2 - 1, UNITY);
lazy.resize(n * 2 - 1, 0);
prop.resize(n * 2 - 1, 0);
if (val != LazySegmentTree::UNITY) {
for (int i = 0; i < m; i++) node[n + i - 1] = val;
build();
}
}
LazySegmentTree(const std::vector<Monoid>& v) {
int sz = v.size();
n = 1; while (n < sz) n <<= 1;
node.resize(n * 2 - 1, UNITY);
lazy.resize(n * 2 - 1, 0);
prop.resize(n * 2 - 1, 0);
for (int i = 0; i < sz; i++) node[i + n - 1] = v[i];
build();
}
// build
void set(int k, const Monoid &x) {
node[n + k - 1] = x;
}
void build() {
for (int i = n - 2; i >= 0; i--) node[i] = F(node[2 * i + 1], node[2 * i + 2]);
}
// [a,b) add
void add_query(int a, int b, Monoid x, int k = 0, int l = 0, int r = -1) {
if (r < 0) r = n;
eval(k, l, r);
// out of range
if (b <= l || r <= a) return;
if (a <= l && r <= b) {
prop[k] = 1;
lazy[k] += (r - l) * x;
eval(k, l, r);
}
else {
add_query(a, b, x, 2 * k + 1, l, (r - l) / 2 + l);
add_query(a, b, x, 2 * k + 2, (r - l) / 2 + l, r);
node[k] = F(node[2 * k + 1], node[2 * k + 2]);
}
}
// [a,b) update
void update_query(int a, int b, Monoid x, int k = 0, int l = 0, int r = -1) {
if (r < 0) r = n;
eval(k, l, r);
// out of range
if (b <= l || r <= a) return;
if (a <= l && r <= b) {
prop[k] = 2;
lazy[k] = (r - l) * x;
eval(k, l, r);
}
else {
update_query(a, b, x, 2 * k + 1, l, (r - l) / 2 + l);
update_query(a, b, x, 2 * k + 2, (r - l) / 2 + l, r);
node[k] = F(node[2 * k + 1], node[2 * k + 2]);
}
}
// [a,b) sum
Monoid get_query(int a, int b, int k = 0, int l = 0, int r = -1) {
if (r < 0) r = n;
if (r <= a || b <= l) return UNITY;
eval(k, l, r);
if (a <= l && r <= b) return node[k];
Monoid vl = get_query(a, b, 2 * k + 1, l, (r - l) / 2 + l);
Monoid vr = get_query(a, b, 2 * k + 2, (r - l) / 2 + l, r);
return F(vl, vr);
}
Monoid operator[](int x) {
return get_query(x, x + 1);
}
void print() {
for (int i = 0; i < n; i++) {
std::cout << i << "\t: " << get_query(i, i + 1) << std::endl;
}
}
};
struct query {
char c; int x, y;
};
int main() {
int n, q; cin >> n >> q;
vector<ll> a(n);
vector<ll> v(n), sum(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
sum[i] = a[i];
}
vector<query> que(q);
for (int i = 0; i < q; i++) {
cin >> que[q - i - 1].c >> que[q - i - 1].x >> que[q - i - 1].y;
}
LazySegmentTree<ll> seg(n, 0);
for (int i = 0; i < q; i++) {
char c = que[i].c;
int x = que[i].x;
int y = que[i].y;
x--;
if (c == 'A') {
sum[x] += y;
v[x] += y * seg.get_query(x, x + 1);
}
else {
seg.add_query(x, y, 1);
}
}
for (int i = 0; i < n; i++) {
cout << a[i] * seg.get_query(i, i + 1) + v[i] << " ";
}
cout << endl;
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0