70分救助,似乎是取模的时候出了问题,球球大佬看看
查看原帖
70分救助,似乎是取模的时候出了问题,球球大佬看看
234964
2408727188GHR楼主2022/8/17 12:18

如题, wa了2,9,10三个点,取模怎么改都有问题,我是每做一步运算,都将数据%=mod 先贴代码,球球大佬看看

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<ll> val, add, mul;
int n, p, mod;

void pull_up(int idx) {
	val[idx] = val[idx * 2] + val[idx * 2 + 1];
	val[idx] %= mod;
}

void make_tag(int idx, int len, int toadd, int tomul) {// child = val * fa_mul + fa_add
	val[idx] *= tomul; //val[idx] %= mod;
	val[idx] += toadd * len % mod; val[idx] %= mod;
	mul[idx] *= tomul; mul[idx] %= mod;
	add[idx] *= tomul; //add[idx] %= mod;
	add[idx] += toadd; add[idx] %= mod;
}//**我怀疑这里出问题了**

void push_down(int idx, int l, int r) {
	int mid = l + (r - l) / 2;
	make_tag(idx * 2, mid - l + 1, add[idx], mul[idx]);
	make_tag(idx * 2 + 1, r - mid, add[idx], mul[idx]);
	add[idx] = 0;
	mul[idx] = 1;
}

void build()
{
	cin >> n >> p >> mod;
	vector<ll> nums(n + 1);
	val.resize(n * 4);
	add.resize(n * 4);
	mul.resize(n * 4, 1);
	for(int i = 1; i <= n; i++)
		cin >> nums[i];
	function<void(int, int, int)> helper = [&](int l, int r, int idx) -> void
	{
		if(l == r) {
			val[idx] = nums[l] % mod;
			return;
		}
		int mid = l + (r - l) / 2;
		helper(l, mid, idx * 2);
		helper(mid + 1, r, idx * 2 + 1);
		pull_up(idx);
	};
	helper(1, n, 1);
}

ll ask(int l, int r, int tar_l, int tar_r, int idx) {
	if(tar_l <= l && r <= tar_r)
		return val[idx];
	else if(r < tar_l || l > tar_r)
		return 0;
	int mid = l + (r - l) / 2;
	push_down(idx, l, r);
	return (ask(l, mid, tar_l, tar_r, idx * 2) + ask(mid + 1, r, tar_l, tar_r, idx * 2 + 1)) % mod;
}

ll ask(int l, int r) {
	return ask(1, n, l, r, 1);
}

void myplus(int l, int r, int tar_l, int tar_r, int idx, int toadd) {
	if(tar_l <= l && r <= tar_r) {
		make_tag(idx, r - l + 1, toadd, 1);
	} else if(r < tar_l || l > tar_r) {
		return;
	} else {
		int mid = l + (r - l) / 2;
		push_down(idx, l, r);
		myplus(l, mid, tar_l, tar_r, idx * 2, toadd);
		myplus(mid + 1, r, tar_l, tar_r, idx * 2 + 1, toadd);
		pull_up(idx);
	}
}

void myplus(int l, int r, int toadd) {
	myplus(1, n, l, r, 1, toadd);
}

void mymul(int l, int r, int tar_l, int tar_r, int idx, int tomul) {
	if(tar_l <= l && r <= tar_r) {
		make_tag(idx, r - l + 1, 0, tomul);
	} else if(r < tar_l || l > tar_r) {
		return;
	} else {
		int mid = l + (r - l) / 2;
		push_down(idx, l, r);
		mymul(l, mid, tar_l, tar_r, idx * 2, tomul);
		mymul(mid + 1, r, tar_l, tar_r, idx * 2 + 1, tomul);
		pull_up(idx);
	}
}

void mymul(int l, int r, int tomul) {
	mymul(1, n, l, r, 1, tomul);
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	FILE *stream;
	freopen_s(&stream, "P3373_2.in", "r", stdin);
	freopen_s(&stream, "out.txt", "w", stdout);
	build();
	for(int i = 1; i <= p; i++) {
		char opt; cin >> opt;
		if(opt == '2') {
			int l, r, toadd;
			cin >> l >> r >> toadd;
			myplus(l, r, toadd);
		} else if(opt == '3') {
			int l, r;
			cin >> l >> r;
			cout << ask(l, r) << '\n';
		} else {
			int l, r, tomul;
			cin >> l >> r >> tomul;
			mymul(l, r, tomul);
		}
	}
	return 0;
}

有没有大佬能解释啊,卡在这3天了,根本看不出哪错,强迫症大悲伤。

2022/8/17 12:18
加载中...