【急】求指明并改正错误
查看原帖
【急】求指明并改正错误
1070523
ybc2027_yangshoukuo楼主2024/3/31 22:09

0分,WA中带着一些RE。。。

#include <bits/stdc++.h>
using namespace std;
const int N = 100005; //
long long n, m, tree[4 * N], a, b, c, d, z[N], tag[4 * N], tag_mul[4 * N], mod;
long long ls(long long k) {
	return k * 2;
}
long long rs(long long k) {
	return k * 2 + 1;
}
void up_update(long long rt) {
	tree[rt] = tree[ls(rt)] + tree[rs(rt)];
}
void add_tag(long long dl, long long dr, long long k, long long rt) {
	tag[rt] += k;
	tree[rt] += (dr - dl + 1) * k;
}
void down_update(long long rt, long long l, long long r) {
	if (tag[rt] != 0) {
		long long mid = (l + r) / 2;
		add_tag(l, mid, tag[rt], ls(rt));
		add_tag(mid + 1, r, tag[rt], rs(rt));
		tag[rt] = 0;
	}
	return;
}
void add_mul_tag(long long dl, long long dr, long long k, long long rt) {
	down_update(rt, dl, dr);
	tag_mul[rt] += k;
	tree[rt] *= k;
}
void down_mul_update(long long rt, long long l, long long r) {
	if (tag_mul[rt] != 0) {
		long long mid = (l + r) / 2;
		add_mul_tag(l, mid, tag_mul[rt], ls(rt));
		add_mul_tag(mid + 1, r, tag_mul[rt], rs(rt));
		tag_mul[rt] = 0;
	}
	return;
}
void begintree(long long l, long long r, long long rt) {
	tag[rt] = 0;
	tag_mul[rt] = 0;
	if (l == r) {
		tree[rt] = z[l];
		return;
	}
	long long mid = (l + r) / 2;
	begintree(l, mid, ls(rt));
	begintree(mid + 1, r, rs(rt));
	up_update(rt);
	return;
}
void qj_num(long long dl, long long dr, long long l, long long r, long long k, long long rt) {
	if (l <= dl && dr <= r) {
		add_tag(dl, dr, k, rt);
		return;
	}
	down_update(rt, dl, dr);
	long long mid = (dl + dr) / 2;
	if (l <= mid) qj_num(dl, mid, l, r, k, ls(rt));
	if (r > mid) qj_num(mid + 1, dr, l, r, k, rs(rt));
	up_update(rt);
	return;
}
void mul_num(long long dl, long long dr, long long l, long long r, long long k, long long rt) {
	if (l <= dl && dr <= r) {
		add_mul_tag(dl, dr, k, rt);
		return;
	}
	down_mul_update(rt, dl, dr);
	long long mid = (dl + dr) / 2;
	if (l <= mid) mul_num(dl, mid, l, r, k, ls(rt));
	if (r > mid) mul_num(mid + 1, dr, l, r, k, rs(rt));
	up_update(rt);
	return;
}
long long print_num(long long dl, long long dr, long long l, long long r, long long rt) {
	if (l <= dl && dr <= r) {
		return tree[rt];
	}
	down_update(rt, dl, dr);
	long long mid = (dl + dr) / 2, res = 0;
	if (l <= mid) res += print_num(dl, mid, l, r, ls(rt));
	res %= mod;
	if (r > mid) res += print_num(mid + 1, dr, l, r, rs(rt));
	res %= mod;
	return res;
}
int main() {
	scanf("%lld%lld%lld", &n, &m, &mod);
	for (int i = 1; i <= n; i++) scanf("%lld", &z[i]);
	begintree(1, n, 1);
	for (int i = 1; i <= m; i++) {
		scanf("%lld%lld%lld", &a, &b, &c);
		if (a == 1) {
			scanf("%lld", &d);
			mul_num(1, n, b, c, d, 1);
		} else if (a == 2) {
			scanf("%lld", &d);
			qj_num(1, n, b, c, d, 1);
		} else {
			printf("%lld\n", print_num(1, n, b, c, 1));
		}
	}
	return 0;
}
2024/3/31 22:09
加载中...