线段树70分求调
查看原帖
线段树70分求调
516518
Syouth楼主2023/9/24 20:57

WA了三个点, 没看出来哪个地方错了,请大家帮忙看一下谢谢

#include<iostream>
#define ls(s) (s << 1)
#define rs(s) ((s << 1) | 1)
using namespace std;
long long n, m, q, a[100005], laz1[400005], laz2[400005], d[400005], num, x, y, k;
//加法的laz1  
void build(long long s, long long t, long long p){
	laz2[p] = 1;
	if(s == t) {d[p] = a[s]; return;}
	else{
		long long mid = s + ((t - s) >> 1);
		build(s, mid, ls(p));
		build(mid + 1, t, rs(p));
		d[p] = (d[ls(p)] + d[rs(p)]);
	}
	d[p] = d[p] % m;
}

void pushdown(int p, int s, int t){
	long long mid = s + ((t - s) >> 1);
	d[p * 2] = (laz2[p] * d[p * 2] + (mid - s + 1) * laz1[p]) % m;
	d[p * 2 + 1] = (laz2[p] * d[p * 2 + 1] + (t - mid) * laz1[p]) % m;
	laz2[p * 2] = (laz2[p] * laz2[p * 2]) % m; 
	laz1[p * 2] = (laz1[p * 2] * laz2[p] + laz1[p]) % m;
	laz2[p * 2 + 1] = (laz2[p] * laz2[p * 2 + 1]) % m; 
	laz1[p * 2 + 1]= (laz1[p * 2 + 1] * laz2[p] + laz1[p]) % m;
	laz1[p] = 0; laz2[p] = 1;
	return;
}
long long get(long long l, long long r, long long s, long long t, long long p){
	if(l <= s && r >= t)return d[p];
	if((laz1[p] || laz2[p])&& s != t)pushdown(p, s, t);
	long long mid = s + ((t - s) >> 1);
	long long sum = 0;
	if(l <= mid) sum = get(l, r, s, mid, ls(p)); sum %= m;
	if(r > mid)  sum += get(l, r, mid + 1, t, rs(p)); 
	return sum % m;
}

void add(long long l, long long r, long long c, long long s, long long t, long long p){
	long long mid = s + ((t - s) >> 1);
	if(l <= s && r >= t){
		d[p] += c * (t - s + 1);
		laz1[p] += c; 
		return;
	}
	if((laz1[p] || laz2[p])&& s != t)pushdown(p, s, t);
	if(l <= mid)add(l, r, c, s, mid, ls(p));
	if(r > mid)add(l, r, c, mid + 1, t, rs(p));
	d[p] = d[ls(p)] + d[rs(p)];d[p] %= m;
}
void mul(long long l, long long r, long long c, long long s, long long t, long long p){
	if(l <= s && r >= t){
		d[p] = (d[p] * c) % m;
		laz2[p] = (laz2[p] * c) % m;
		laz1[p] = (laz1[p] * c) % m;
		return;
	}
	if((laz1[p] || laz2[p])&& s != t)pushdown(p, s, t);
	long long mid = s + ((t - s) >> 1);
	if(l <= mid)mul(l, r, c, s, mid, ls(p));
	if(r > mid)mul(l, r, c, mid + 1, t, rs(p));
	d[p] = (d[ls(p)] + d[rs(p)]) % m;
	return;
}

int main(){
//	freopen("P3373_2.in", "r", stdin);
	std::ios::sync_with_stdio(false);
	cin>>n>>q>>m;
	for(long long i = 1; i <= n; ++i)cin>>a[i];
	build(1, n, 1);
	while(q--){
		cin>>num;
		if(num == 1){
			cin>>x>>y>>k;
			mul(x, y, k, 1, n, 1);
		}
		else if(num == 2){
			cin>>x>>y>>k;
			add(x, y, k, 1, n, 1);
		}
		else{
			cin>>x>>y;
			cout<<get(x, y, 1, n, 1)<<"\n";
		}
	}
	return 0;
} 
2023/9/24 20:57
加载中...