为什么只有30分啊,mod都加了啊
查看原帖
为什么只有30分啊,mod都加了啊
279699
Ivan1367楼主2021/5/3 22:32

求助求助 到底哪里有问题啊,只有30分

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

typedef long long LL;

LL w[N];
LL mod;

struct Node
{
	LL l, r;
	LL sum, add;
	LL muls;
}tr[4 * N];

void pushup(LL u)
{
	tr[u].sum = (tr[u << 1].sum + tr[u << 1 | 1].sum) % mod;
}

void pushdown(LL u)
{
	auto &root = tr[u], &left = tr[u << 1], &right = tr[u << 1 | 1];

	left.add = (left.add + root.add) % mod;
	right.add = (right.add + root.add) % mod;
	
	
	left.sum = (left.sum * root.muls % mod + (left.r - left.l + 1) * root.add % mod) % mod;//'add' has been multipled
	right.sum = (right.sum * root.muls % mod + (right.r - right.l + 1) * root.add % mod) % mod;
	

	left.muls = left.muls * root.muls % mod;
	right.muls = right.muls * root.muls % mod;
	
	root.muls = 1;
	root.add = 0;
}

void build(LL u, LL l, LL r)
{
	if (l == r) tr[u] = {l, r, w[r] % mod, 0, 1};
	else
	{
		tr[u] = {l, r};
		tr[u].muls = 1;
		LL mid = tr[u].l + tr[u].r >> 1;
		build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
		pushup(u);
	}
}

void modify(LL u, LL l, LL r, LL d)//加上d 
{
	if (tr[u].l >= l && tr[u].r <= r)
	{
		tr[u].add = (tr[u].add + d) % mod;
		tr[u].sum = (tr[u].sum + (tr[u].r - tr[u].l + 1) * d % mod) % mod;
	}
	else 
	{
		pushdown(u);
		LL mid = tr[u].l + tr[u].r >> 1;
		if (l <= mid) modify(u << 1, l, r, d);
		if (r > mid) modify(u << 1 | 1, l, r, d);
		pushup(u);
	}
}

void mul(LL u, LL l, LL r, LL d)//乘d 
{
	if (tr[u].l >= l && tr[u].r <= r)
	{
		tr[u].muls = tr[u].muls * d % mod;
		tr[u].add = tr[u].add * d % mod;// 
		tr[u].sum = tr[u].sum * d % mod;
	}
	else 
	{
		pushdown(u);
		LL mid = tr[u].l + tr[u].r >> 1;
		if (l <= mid) mul(u << 1, l, r, d);
		if (r > mid) mul(u << 1 | 1, l, r, d);
		pushup(u);
	}
}

LL query(LL u, LL l, LL r)
{
	if (tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
	else 
	{
		pushdown(u);
		LL mid = tr[u].l + tr[u].r >> 1;
		LL sum = 0;
		if (l <= mid) sum = (sum + query(u << 1, l, r)) % mod;
		if (r > mid) sum = (sum + query(u << 1 | 1, l, r)) % mod;
		return sum;
	}
}

int main()
{
	LL n, m;
	cin >> n >> m >> mod;
	for (int i = 1; i <= n; i ++ ) cin >> w[i];
	build(1, 1, n);
	while (m -- )
	{
		LL op, l, r;
		cin >> op >> l >> r;
		if (op == 2)
		{
			LL d;
			cin >> d;
			modify(1, l, r, d);
		}
		else if (op == 3)
		{
			cout << query(1, l, r) << endl;
		}
		else
		{
			LL d;
			cin >> d;
			mul(1, l, r, d);
		}
	}
	return 0;
}
2021/5/3 22:32
加载中...