WA,0分,向各位求助,谢谢!
查看原帖
WA,0分,向各位求助,谢谢!
784308
smartbrisk楼主2024/7/26 10:28

WA,0分,向各位求助,谢谢! 其中#1点把 562114562114 错误输成 317199317199

#include <cstdio>
using namespace std;

const int N = 1e5;

typedef long long ll;

ll arr[N], sum[N << 2], add[N << 2], mul[N << 2];
//int L[N << 2], R[N << 2];
ll mod; 

inline void pushUp(int i)
{
	sum[i] = (sum[i << 1] + sum[i << 1 | 1]) % mod;
}

void pushDownAdd(int i, int l, int m, int r)
{
	if (l == r)
	{
		return;
	}
	(add[i << 1] += add[i]) %= mod; 
	(add[i << 1 | 1] += add[i]) %= mod;
	(sum[i << 1] += add[i] * (m - l + 1)) %= mod;
	(sum[i << 1 | 1] += add[i] * (r - m)) %= mod; 
	add[i] = 0; 
}

void pushDownMul(int i, int l, int m, int r)
{
	if (l == r)
	{
		return;
	}
	(mul[i << 1] *= mul[i]) %= mod;
	(mul[i << 1 | 1] *= mul[i]) %= mod;
	(sum[i << 1] *= mul[i]) %= mod;
	(sum[i << 1 | 1] *= mul[i]) %= mod;
	mul[i] = 1; 
}

void pushDown(int i, int l, int m, int r)
{
	pushDownMul(i, l, m, r);
	pushDownAdd(i, l, m, r);
}

void build(int i, int l, int r)
{
//	L[i] = l;
//	R[i] = r;
	
	mul[i] = 1;
	if (l == r)
	{
		sum[i] = arr[l];
		return;
	}

	int mid = (l + r) >> 1;
	build(i << 1, l, mid);
	build(i << 1 | 1, mid + 1, r);
	pushUp(i);
}

void addVal(int i, int al, int ar, int l, int r, ll val)
{
	int mid = (l + r) >> 1;
	pushDown(i, l, mid, r);
	if (al <= l && r <= ar)
	{
		(add[i] += val) %= mod;
		(sum[i] += (r - l + 1) * val) %= mod;
		return;
 	}
	if (mid >= al) 
	{
		addVal(i << 1, al, ar, l, mid, val);
	}
	if (mid + 1 <= ar)
	{
		addVal(i << 1 | 1, al, ar, mid + 1, r, val);
	}
	pushUp(i);
} 

void mulVal(int i, int al, int ar, int l, int r, ll val)
{
	int mid = (l + r) >> 1;
	pushDownAdd(i, l, mid, r);
	if (al <= l && r <= ar)
	{
		(mul[i] *= val) %= mod;
		(sum[i] *= val) %= mod;
		return;
 	}
	if (mid >= al) 
	{
		mulVal(i << 1, al, ar, l, mid, val);
	}
	if (mid + 1 <= ar)
	{
		mulVal(i << 1 | 1, al, ar, mid + 1, r, val);
	}
	pushUp(i);	
}

ll query(int i, int ql, int qr, int l, int r)
{
	if (ql <= l && r <= qr)
	{
//		printf("222222\nquery()::ans was added by [%d,%d] : sum=%d\n22222222\n", l, r, sum[i]);
		return sum[i];
	} 
	int mid = (l + r) >> 1;
	pushDown(i, l, mid, r);
	ll ans = 0;
	if (mid >= ql)
	{
		ans = (ans + query(i << 1, ql, qr, l, mid)) % mod;
	}
	if (mid + 1 <= qr)
	{
		ans = (ans + query(i << 1 | 1, ql, qr, mid + 1, r)) % mod;	
	}
	pushUp(i);
	return ans;
}

void print(int n, const char* str)
{
	for (int i = 1; i <= n; ++i)
	{
//		printf("[%d~%d] : (s=%lld, a=%lld, m=%lld)\n", 
//		 L[i], R[i], sum[i], add[i], mul[i]);
	}
	printf(str);
}

int main()
{
//	freopen("P3373.in", "r", stdin);	
//	freopen("P3373.out", "w", stdout);
	int n, m, t, l, r;
	ll val;
	scanf("%d%d%lld", &n, &m, &mod);
	for (int i = 1; i <= n; ++i)
	{
		scanf("%lld", &arr[i]);
		arr[i] %= mod;
 	}
	build(1, 1, n);
//	print(n << 2, "========\n");
	while (m--)
	{
		scanf("%d%d%d", &t, &l, &r);
		if (t == 1)
		{
			scanf("%lld", &val); 
			mulVal(1, l, r, 1, n, val);
		}
		else if (t == 2)
		{
			scanf("%lld", &val); 
			addVal(1, l, r, 1, n, val);			
		}
		else
		{
			printf("%lld\n", query(1, l, r, 1, n));
		}
//		print(n << 2, "11111111111111\n");
	}
}

经过我自己用打log等方式调试,怀疑是乘法(或乘法时的 pushDownpushDown 操作不对),请求各位帮助,谢谢!

2024/7/26 10:28
加载中...