样例过了 全WA求助
查看原帖
样例过了 全WA求助
125986
prince_he楼主2022/10/26 19:22

是不是区间乘法错了?求助

#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 5;
long long n, m, p; 
long long x, y, k, q;
long long a[N], d[N << 2], b[N << 2], v[N << 2];
void build(long long l, long long r, long long root){
	if(l == r){
		d[root] = a[l] % p;
		return;
	}
	long long m = l + ((r - l) >> 1);
	build(l, m, root * 2);
	build(m + 1, r, root * 2 + 1);
	d[root] = (d[root << 1] % p + d[(root << 1) + 1] % p) % p;
}
long long getsum(long long l, long long r, long long s, long long t, long long root){
	if(l <= s && t <= r)
		return d[root] % p;
	long long m = s + ((t - s) >> 1);
	if(b[root]){
		d[root * 2] += b[root] * (m - s + 1) % p;
		d[root * 2 + 1] += b[root] * (t - m) % p;
		d[root * 2] %= p;
		d[root * 2 + 1] %= p;
    	b[root * 2] += b[root] % p;
		b[root * 2 + 1] += b[root] % p; 
		b[root * 2] %= p;
		b[root * 2 + 1] %= p;
    	b[root] = 0;                     
    }
    long long sum = 0;
    if(l <= m){
    	sum += getsum(l, r, s, m, root * 2) % p;
    	sum %= p;
	}
  	if(r > m) {
  		sum += getsum(l, r, m + 1, t, root * 2 + 1) % p;
  		sum %= p;
	}
  	return sum;
}
void update(long long l, long long r, long long c, long long s, long long t, long long root){ 
	if(l <= s && t <= r){
    	d[root] += (t - s + 1) * c;
		b[root] += c;
		d[root] %= p;
		b[root] %= p;
    	return;
  	}
  	long long m = s + ((t - s) >> 1);
  	if(b[root] && s != t) {
		d[root * 2] += b[root] * (m - s + 1) % p;
		d[root * 2 + 1] += b[root] * (t - m) % p;
		d[root * 2] %= p;
		d[root * 2 + 1] %= p;
    	b[root * 2] += b[root] % p;
		b[root * 2 + 1] += b[root] % p;  
		b[root * 2] %= p;
		b[root * 2 + 1] %= p;
    	b[root] = 0;                                
  	}
  	if(l <= m) 
	  	update(l, r, c, s, m, root * 2);
    if(r > m) 
		update(l, r, c, m + 1, t, root * 2 + 1);
    d[root] = (d[root * 2] % p + d[root * 2 + 1] % p) % p;
}
void update2(long long l, long long r, long long c, long long s, long long t, long long root){ //区间乘法 
	//if(t < l || s > r)
	//	return;
	if(l <= s && t <= r){
    	d[root] *= c;
		v[root] *= c;
		b[root] *= c;
    	return;
  	}
  	long long m = s + ((t - s) >> 1);
  	if(v[root] != 1 && s != t) {
		d[root * 2] += b[root] * (m - s + 1) % p;
		d[root * 2 + 1] += b[root] * (t - m) % p;
		d[root * 2] %= p;
		d[root * 2 + 1] %= p;
    	v[root * 2] *= v[root] % p;
		v[root * 2 + 1] *= v[root] % p;  
		v[root * 2] %= p;
		v[root * 2 + 1] %= p;
		b[root * 2] = (b[root * 2] * v[root] + b[root]) % p;
		b[root * 2 + 1] = (b[root * 2 + 1] * v[root] + b[root]) % p;  
		b[root * 2] %= p;
		b[root * 2 + 1] %= p;
    	v[root] = 1;      
		b[root] = 0;                          
  	}
  	if(l <= m) 
	  	update2(l, r, c, s, m, root * 2);
    if(r > m) 
		update2(l, r, c, m + 1, t, root * 2 + 1);
    d[root] = (d[root * 2] % p + d[root * 2 + 1] % p) % p;
}
int main(){
	cin >> n >> m >> p;
	for(long long i = 1; i <= n; ++i)
		cin >> a[i];
	build(1, n, 1);
	memset(v, 1, sizeof(v));
	for(long long i = 1; i <= m; ++i){
		cin >> q;
		if(q == 1){
			cin >> x >> y >> k;
			update2(x, y, k, 1, n, 1);
		}
		else if(q == 2){
			cin >> x >> y >> k;
			update(x, y, k, 1, n, 1);
		}
		else{
			cin >> x >> y;
			cout << getsum(x, y, 1, n, 1) % p << endl;
		}
	}
	return 0;
}
2022/10/26 19:22
加载中...