60分求调
查看原帖
60分求调
1808406
morikawa_hitomi楼主2025/7/24 13:48

所有没过的点都是WrongAnswer,所有错误的原因都是answer too short on line 330.

#include<vector>
using namespace std;
long long n, q, m;
class MultiOPSegmentTree {
private:
	vector<long long>seg_node;
	vector<long long>lazy_mul;
	vector<long long>lazy_add;
	void update(long long p) {
		seg_node[p] = (seg_node[p << 1] + seg_node[p << 1 | 1]) % m;
	}
	void build(long long l, long long r, long long p) {
		if (l == r) {
			seg_node[p] = arr[l];
			lazy_add[p] = 0;
			lazy_mul[p] = 1;
			return;
		}
		long long mid = (l + r) >> 1;
		build(l, mid, p << 1);
		build(mid + 1, r, p << 1 | 1);
		lazy_add[p] = 0;
		lazy_mul[p] = 1;
		update(p);
		return;
	}
	void push_down(long long l, long long r, long long p) {
		long long mid = (l + r) >> 1;
		seg_node[p << 1] = (seg_node[p << 1] * lazy_mul[p] + lazy_add[p] * (mid - l + 1)) % m;
		lazy_mul[p << 1] = (lazy_mul[p << 1] * lazy_mul[p]) % m;
		lazy_add[p << 1] = (lazy_add[p << 1] * lazy_mul[p] + lazy_add[p]) % m;

		seg_node[p << 1 | 1] = (seg_node[p << 1 | 1] * lazy_mul[p] + lazy_add[p] * (r - mid)) % m;
		lazy_mul[p << 1 | 1] = (lazy_mul[p << 1 | 1] * lazy_mul[p]) % m;
		lazy_add[p << 1 | 1] = (lazy_add[p << 1 | 1] * lazy_mul[p] + lazy_add[p]) % m;

		lazy_add[p] = 0;
		lazy_mul[p] = 1;
		return;
	}
	void mul(long long l, long long r, long long p, long long x, long long y, long long k) {
		if (l >= x && r <= y) {
			lazy_mul[p] = (lazy_mul[p] * k) % m;
			lazy_add[p] = (lazy_add[p] * k) % m;
			seg_node[p] = (seg_node[p] * k) % m;
			return;
		}
		push_down(l,r,p);
		long long mid = (l + r) >> 1;
		if (mid >= x) mul(l, mid, p << 1, x, y, k);
		if (mid < y) mul(mid + 1, r, p << 1 | 1, x, y, k);
		update(p);
		return;
	}
	void add(long long l, long long r, long long p, long long x, long long y, long long k) {
		if(l >= x && r <= y) {
			lazy_add[p] = (lazy_add[p] + k) % m;
			seg_node[p] = (seg_node[p] + k * (r - l + 1)) % m;
			return;
		}
		push_down(l, r, p);
		long long mid = (l + r) >> 1;
		if (mid >= x) add(l, mid, p << 1, x, y, k);
		if (mid < y) add(mid + 1, r, p << 1 | 1, x, y, k);
		update(p);
		return;
	}
	long long query(long long l, long long r, long long p, long long x, long long y) {
		if (l >= x && r <= y) {
			return seg_node[p];
		}
		push_down(l, r, p);
		long long ans = 0;
		long long mid = (l + r) >> 1;
		if (mid >= x) ans = (ans + query(l, mid, p << 1, x, y)) % m;
		if (mid < y) ans = (ans + query(mid + 1, r, p << 1 | 1, x, y)) % m;
		return ans;
	}
public:
	MultiOPSegmentTree() {
		long long size = n + 1;
		arr.resize(size);
		seg_node.resize(size << 2);
		lazy_mul.resize(size << 2);
		lazy_add.resize(size << 2);
	}
	vector<long long>arr;
	void build() {
		build(1, n, 1);
	}
	void mul(long long x, long long y, long long k) {
		mul(1, n, 1, x, y, k);
		return;
	}
	void add(long long x, long long y, long long k) {
		add(1, n, 1, x, y, k);
		return;
	}
	long long query(long long x, long long y) {
		return query(1, n, 1, x, y);
	}
};
int main() {
	long long op, x, y, k;
	cin >> n >> q >> m;
	MultiOPSegmentTree tr;
	for (long long i = 1; i <= n; i++)
		cin >> tr.arr[i];
	tr.build();
	for (long long i = 1; i <= n; i++) {
		cin >> op;
		switch (op) {
		case(1)://mul
			cin >> x >> y >> k;
			tr.mul(x, y, k);
			break;
		case(2):///add
			cin >> x >> y >> k;
			tr.add(x, y, k);
			break;
		case(3):
			cin >> x >> y;
			cout << tr.query(x, y) << endl;
			break;
		}
	}
}
2025/7/24 13:48
加载中...