0分求调
查看原帖
0分求调
601770
SCL1112345EYD楼主2024/8/16 22:04
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int n, m, x, y, op, k, cnt = 0, a[N];
ll mod;
struct node {
	int ch[2], l, r;
	ll al, ml, sum;
} t[2 * N];
#define lson t[i].ch[0]
#define rson t[i].ch[1]
void buildtree(int i, int l, int r) {
	t[i].ml = 1, t[i].l = l, t[i].r = r;
	if(l == r) {
		t[i].sum = a[l] % mod;
		return ;
	}
	lson = ++ cnt; buildtree(lson, l, l + r >> 1);
	rson = ++ cnt; buildtree(rson, (r + l >> 1) + 1, r);
	t[i].sum = (t[lson].sum + t[rson].sum) % mod;
}
void pdm(int i) {
	if(t[i].ml != 1) {
		if(lson) {
			t[lson].ml *= t[i].ml, t[lson].ml %= mod;
			t[lson].al *= t[i].ml, t[lson].al %= mod;
			t[lson].sum *= t[i].ml, t[lson].sum %= mod;
		}
		if(rson) {
			t[rson].ml *= t[i].ml, t[rson].ml %= mod;
			t[rson].al *= t[i].ml, t[rson].al %= mod;
			t[rson].sum *= t[i].ml,	t[rson].sum %= mod;
		}
		t[i].ml = 1;
	}
}
void pda(int i) {
	if(t[i].al) {
//		pdm(i);
		if(lson) {
			t[lson].sum += (t[lson].r - t[lson].l + 1) * t[i].al, t[lson].sum %= mod;
			t[lson].al += t[i].al, t[lson].al %= mod;
		}
		if(rson) {
			t[rson].sum += (t[rson].r - t[rson].l + 1) * t[i].al, t[rson].sum %= mod;
			t[rson].al += t[i].al, t[rson].al %= mod;
		}
		t[i].al = 0;
	}
}
void pushdown(int i) {
	pdm(i), pda(i);
}
void mul(int i, int l, int r, ll z) {
	if(l <= t[i].l && t[i].r <= r) {
		t[i].ml *= z, t[i].ml %= mod;
		t[i].al *= z, t[i].al %= mod;
		t[i].sum *= z, t[i].sum %= mod;
		return ;
	}
	pushdown(i);
	if(l <= t[lson].r) mul(lson, l, r, z);	
	if(r >= t[rson].l) mul(rson, l, r, z);
	t[i].sum = (t[lson].sum + t[rson].sum) % mod;
}
void add(int i, int l, int r, ll z) {
	if(l <= t[i].l && t[i].r <= r) {
//		pdm(i);
		t[i].al += z, t[i].al %= mod;
		t[i].sum += z * (t[i].r - t[i].l + 1), t[i].sum %= mod;
		return ;
	}
	pushdown(i);
	if(l <= t[lson].r) add(lson, l, r, z);	
	if(r >= t[rson].l) add(rson, l, r, z);
	t[i].sum = (t[lson].sum + t[rson].sum) % mod;
}
ll query(int i, int l, int r) {
	if(l <= t[i].l && t[i].r <= r) return t[i].sum;
	pushdown(i);
	ll ans = 0;
	if(l <= t[lson].r) ans = (ans + query(lson, l, r)) % mod; 
	if(r >= t[rson].l) ans = (ans + query(rson, l, r)) % mod; 
	return ans;
}
int main() {
    scanf("%d%d%lld", &n, &m, &mod);
	for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
	buildtree(1, 1, n);
	for(int i = 1; i <= m; i ++) {
		scanf("%d", &op);
		if(op == 1) {
			scanf("%d%d%d", &x, &y, &k);
			mul(1, x, y, k);
		} else if(op == 2) {
			scanf("%d%d%d", &x, &y, &k);
			add(1, x, y, k);
		} else {
			scanf("%d%d", &x, &y);
			printf("%lld\n", query(1, x, y));
		}
	}
	return 0;
}

大佬求解

不知道为啥样例输出的是13和34

2024/8/16 22:04
加载中...