P9989 [Ynoi Easy Round 2023] TEST_69
[Ynoi Easy Round 2023] TEST_69
题目描述
给定一个长为
每次有两种操作:
1 l r x
:对于区间
2 l r
:查询区间
对于
Solution
很典的套路,不愧是 Easy Round。
考虑
这就和区间开方、区间
那么只需要判定这个区间内是否存在一个数可以被修改了。考虑如果一个区间无法被更改会有什么性质,不难发现这个区间内的所有数都应该是修改值的因数。也就是说,修改值一定是区间内所有数的
题面值域是 long long
。另外,如果一个区间的
总时间复杂度
Code
int N, M;
i64 A[_N];
i64 lcm(i64 x, i64 y) {
i64 g = gcd(x, y);
long double tmp = x * 1. / g * y;
if (tmp > inf) return inf;
return x / g * y;
}
struct Segtree {
u32 val[_N<<2];
i64 tag[_N<<2];
#define LC (k << 1)
#define RC (k << 1 | 1)
#define mid ((l + r) >> 1)
void pushup(int k) {
val[k] = val[LC] + val[RC];
tag[k] = lcm(tag[LC], tag[RC]);
}
void build(int k, int l, int r) {
if (l == r) return val[k] = tag[k] = A[l], void();
build(LC, l, mid), build(RC, mid + 1, r), pushup(k);
}
void update(int k, int l, int r, int a, int b, i64 v) {
if (v % tag[k] == 0) return ;
if (l == r) return val[k] = tag[k] = gcd(tag[k], v), void();
if (a <= mid) update(LC, l, mid, a, b, v);
if (b > mid) update(RC, mid + 1, r, a, b, v);
pushup(k);
}
u32 query(int k, int l, int r, int a, int b) {
if (l >= a && r <= b) return val[k];
u32 res = 0;
if (a <= mid) res += query(LC, l, mid, a, b);
if (b > mid) res += query(RC, mid + 1, r, a, b);
return res;
}
} sgt;
void _() {
cin >> N >> M;
For(i, 1, N) cin >> A[i];
sgt.build(1, 1, N);
while (M--) {
int opt, l, r; i64 x;
cin >> opt >> l >> r;
if (opt == 1) {
cin >> x;
sgt.update(1, 1, N, l, r, x);
} else fmtout("{}\n", sgt.query(1, 1, N, l, r));
}
}
分类:
标签:
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步