如题, 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天了,根本看不出哪错,强迫症大悲伤。