社区讨论

样例不过,0pts求调

P3373【模板】线段树 2参与者 4已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@lo1x1rzx
此快照首次捕获于
2023/10/23 04:23
2 年前
此快照最后确认于
2023/11/03 04:50
2 年前
查看原帖
CPP
#include <stdio.h>
#define int long long
const int N = 1e5 + 10;
int n, q, m;
struct node { int s, tg, tg1 = 1; } t[N << 2];
inline int ls(int u) { return u << 1; }
inline int rs(int u) { return u << 1 | 1; }
inline void PushUp(int u) { t[u].s = t[ls(u)].s + t[rs(u)].s; }
void PushDown(int l, int r, int u) {
	if (l == r) return;
	int add = t[u].tg, mul = t[u].tg1;
	t[ls(u)].tg = t[ls(u)].tg * mul % m; t[rs(u)].tg = t[rs(u)].tg * mul % m;
	t[ls(u)].tg1 = t[ls(u)].tg1 * mul % m; t[rs(u)].tg1 = t[rs(u)].tg1 * mul % m;
	t[ls(u)].s = t[ls(u)].s * mul % m; t[rs(u)].s = t[rs(u)].s * mul % m;
	if (!add) return;
	t[ls(u)].tg += t[u].tg; t[rs(u)].tg += t[u].tg;
	int m = l + r >> 1;
	t[ls(u)].s += t[u].tg * (m - l + 1); t[rs(u)].s += t[u].tg * (r - m);
	t[u].tg = 0; t[u].tg1 = 1;
}
void Build(int l, int r, int u) {
	if (l == r) { scanf("%lld", &t[u].s); return; }
	int m = l + r >> 1;
	Build(l, m, ls(u)); Build(m + 1, r, rs(u));
	PushUp(u);
}
void Update1(int L, int R, int k, int l, int r, int u) {
	if (L <= l && r <= R) { 
		t[u].s = t[u].s * k % m; 
		t[u].tg = t[u].tg * k % m; t[u].tg1 = t[u].tg1 * k % m;
		return; 
	}
	PushDown(l, r, u);
	int m = l + r >> 1;
	if (L <= m) Update1(L, R, k, l, m, ls(u));
	if (m < R) Update1(L, R, k, m + 1, r, rs(u));
	PushUp(u);
}
void Update2(int L, int R, int k, int l, int r, int u) {
	if (L <= l && r <= R) { 
		t[u].s = (t[u].s + k * (r - l + 1) % m) % m; 
		t[u].tg = (t[u].tg + k) % m; 
		return; 
	}
	PushDown(l, r, u);
	int m = l + r >> 1;
	if (L <= m) Update2(L, R, k, l, m, ls(u));
	if (m < R) Update2(L, R, k, m + 1, r, rs(u));
	PushUp(u);
}
int Query(int L, int R, int l, int r, int u) {
	if (L <= l && r <= R) return t[u].s;
	PushDown(l, r, u);
	int s = 0, m = l + r >> 1;
	if (L <= m) s = (s + Query(L, R, l, m, ls(u))) % m;
	if (m < R) s = (s + Query(L, R, m + 1, r, rs(u))) % m;
	return s;
}
signed main() {
	scanf("%lld%lld%lld", &n, &q, &m);
	Build(1, n, 1);
	while (q--) {
		int op, x, y;
		scanf("%lld%lld%lld", &op, &x, &y);
		if (op == 1) { int k; scanf("%lld", &k); Update1(x, y, k, 1, n, 1); }
		else if (op == 2) { int k; scanf("%lld", &k); Update2(x, y, k, 1, n, 1); }
		else printf("%lld\n", Query(x, y, 1, n, 1) % m);
	}
	return 0;
}
正确输出应为17 2,而此代码输出为1 2,应该是Query函数出了问题,请问如何修改?

回复

10 条回复,欢迎继续交流。

正在加载回复...