結果
| 問題 | No.880 Yet Another Segment Tree Problem |
| コンテスト | |
| ユーザー |
risujiroh
|
| 提出日時 | 2020-09-11 16:43:07 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,834 bytes |
| 記録 | |
| コンパイル時間 | 3,532 ms |
| コンパイル使用メモリ | 254,896 KB |
| 最終ジャッジ日時 | 2025-01-14 09:39:29 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 32 TLE * 5 |
ソースコード
#include <bits/extc++.h>
struct beats {
struct node {
int64_t mx, sum;
friend node operator*(node a, node b) {
return {std::max(a.mx, b.mx), a.sum + b.sum};
}
};
int sz;
std::vector<node> tree;
beats(int n) {
for (sz = 1; sz < n;) sz *= 2;
tree.resize(2 * sz);
for (int i = 0; i < n; ++i) {
int a;
std::cin >> a;
tree[sz + i] = {a, a};
}
for (int i = sz; i-- > 1;) pull(i);
}
void pull(int i) { tree[i] = tree[2 * i] * tree[2 * i + 1]; }
void push(int i, int j, int len) {
if (tree[i].mx * len == tree[i].sum) {
tree[j].mx = tree[i].mx;
tree[j].sum = tree[i].sum / 2;
}
}
void assign(int l, int r, int x, int i, int a, int b) {
if (r <= a or b <= l) return;
if (l <= a and b <= r) {
tree[i].mx = x;
tree[i].sum = tree[i].mx * (b - a);
return;
}
push(i, 2 * i, b - a), push(i, 2 * i + 1, b - a);
int m = (a + b) >> 1;
assign(l, r, x, 2 * i, a, m), assign(l, r, x, 2 * i + 1, m, b);
pull(i);
}
void assign(int l, int r, int x) { assign(l, r, x, 1, 0, sz); }
void gcd(int l, int r, int x, int i, int a, int b) {
if (r <= a or b <= l) return;
if (l <= a and b <= r and tree[i].mx * (b - a) == tree[i].sum) {
tree[i].mx = std::gcd(tree[i].mx, x);
tree[i].sum = tree[i].mx * (b - a);
return;
}
push(i, 2 * i, b - a), push(i, 2 * i + 1, b - a);
int m = (a + b) >> 1;
gcd(l, r, x, 2 * i, a, m), gcd(l, r, x, 2 * i + 1, m, b);
pull(i);
}
void gcd(int l, int r, int x) { gcd(l, r, x, 1, 0, sz); }
int max(int l, int r, int i, int a, int b) {
if (r <= a or b <= l) return 0;
if (l <= a and b <= r) return tree[i].mx;
push(i, 2 * i, b - a), push(i, 2 * i + 1, b - a);
int m = (a + b) >> 1;
return std::max(max(l, r, 2 * i, a, m), max(l, r, 2 * i + 1, m, b));
}
int max(int l, int r) { return max(l, r, 1, 0, sz); }
int64_t sum(int l, int r, int i, int a, int b) {
if (r <= a or b <= l) return 0;
if (l <= a and b <= r) return tree[i].sum;
push(i, 2 * i, b - a), push(i, 2 * i + 1, b - a);
int m = (a + b) >> 1;
return sum(l, r, 2 * i, a, m) + sum(l, r, 2 * i + 1, m, b);
}
int64_t sum(int l, int r) { return sum(l, r, 1, 0, sz); }
};
int main() {
using namespace std;
cin.tie(nullptr)->sync_with_stdio(false);
int n, q;
cin >> n >> q;
beats b(n);
while (q--) {
int t, l, r;
cin >> t >> l >> r;
--l;
if (t == 1) {
int x;
cin >> x;
b.assign(l, r, x);
} else if (t == 2) {
int x;
cin >> x;
b.gcd(l, r, x);
} else if (t == 3) {
cout << b.max(l, r) << '\n';
} else {
cout << b.sum(l, r) << '\n';
}
}
}
risujiroh