0分求助!!!马蜂良好,玄关
查看原帖
0分求助!!!马蜂良好,玄关
965334
1_1_1_1_1_1_楼主2024/5/18 23:00

样例过了,但全WA

有没有大佬救救孩子的

#include<bits/stdc++.h>
#define ll long long

using namespace std;

ll n, q, mod;
ll a[100001];
ll sum[400001];
ll jiatag[400001];
ll chengtag[400001];

void input();
void init();
void output();
void build(ll id, ll l, ll r);
void jia(ll id, ll l, ll r, ll left, ll right, ll x);
void cheng(ll id, ll l, ll r, ll left, ll right, ll x);
ll find(ll id, ll l, ll r, ll left, ll right);
void push_down(ll id, ll l, ll r);
void push_up(ll id);

int main()
{
	input();
	init();
	build(1, 1, n);
	output();
	return 0;
}

void push_down(ll id, ll l, ll r)
{
	ll mid = (l + r) / 2;
	//由分配律得: 现sum[id*2] = (原sum[id*2] + 原jiatag[id*2])*chengtag[id] = 原sum[id*2]*chengtag[id] + 原jiatag[id*2]*chengtag[id] 
	//因为jiatag[id]的值是要包括乘之后的值,所以子树的jiatag[id*2]要先乘上chengtag[id]
	sum[id * 2] = sum[id * 2] * chengtag[id] + jiatag[id] * (l - mid + 1);
	sum[id * 2] %= mod;
	chengtag[id * 2] = chengtag[id * 2] * chengtag[id];
	chengtag[id * 2] %= mod;
	jiatag[id * 2] = jiatag[id * 2] * chengtag[id] + jiatag[id];
	jiatag[id * 2] %= mod;
	
	sum[id * 2 + 1] = sum[id * 2 + 1] * chengtag[id] + jiatag[id] * (r - mid);
	sum[id * 2 + 1] %= mod;
	chengtag[id * 2 + 1] = chengtag[id * 2 + 1] * chengtag[id];
	chengtag[id * 2 + 1] %= mod;
	jiatag[id * 2 + 1] = jiatag[id * 2 + 1] * chengtag[id] + jiatag[id];
	jiatag[id * 2 + 1] %= mod;
	
	chengtag[id] = 1;
	jiatag[id] = 0;
}

void push_up(ll id)
{
	sum[id] = sum[id * 2] + sum[id * 2 + 1];
	sum[id] %= mod;
}

void build(ll id, ll l, ll r)
{
	if(l == r)
	{
		sum[id] = a[l];
		return;
	}
	ll mid = (l + r) / 2;
	build(id * 2, l, mid);
	build(id * 2 + 1, mid + 1, r);
	push_up(id);
}

void jia(ll id, ll l, ll r, ll left, ll right, ll x)
{
	if(left <= l && r <= right)
	{
		sum[id] += x * (r - l + 1);
		sum[id] %= mod;
		jiatag[id] += x;
		jiatag[id] %= mod;
		return;
	}
	push_down(id, l, r);
	ll mid = (l + r) / 2;
	if(left <= mid)
	{
		jia(id * 2, l, mid, left, right, x);
	}
	if(right > mid)
	{
		jia(id * 2 + 1, mid + 1, r, left, right, x);
	}
	push_up(id);
}

void cheng(ll id, ll l, ll r, ll left, ll right, ll x)
{
	if(left <= l && r <= right)
	{
		sum[id] *= x;
		sum[id] %= mod;
		jiatag[id] *= x;
		jiatag[id] %= mod;
		chengtag[id] *= x;
		chengtag[id] %= mod;
		return;
	}
	push_down(id, l, r);
	ll mid = (l + r) / 2;
	if(left <= mid)
	{
		cheng(id * 2, l, mid, left, right, x);
	}
	if(right > mid)
	{
		cheng(id * 2 + 1, mid + 1, r, left, right, x);
	}
	push_up(id);
}

ll find(ll id, ll l, ll r, ll left, ll right)
{
	if(left <= l && r <= right)
	{
		return sum[id];
	}
	push_down(id, l, r);
	ll mid = (l + r) / 2;
	ll cnt = 0;
	if(left <= mid)
	{
		cnt += find(id * 2, l, mid, left, right);
	}
	if(right > mid)
	{
		cnt += find(id * 2 + 1, mid + 1, r, left, right);
	}
	return cnt % mod;
}

void input()
{
	cin >> n >> q >> mod;
	for(ll i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
}

void init()
{
	for(int i = 1; i <= 400000; i++)
	{
		chengtag[i] = 1;
	}
}

void output()
{
	for(ll i = 1; i <= q; i++)
	{
		ll op, l, r;
		cin >> op >> l >> r;
		if(op == 1)
		{
			ll x;
			cin >> x;
			cheng(1, 1, n, l, r, x); 
		}
		else if(op == 2)
		{
			ll x;
			cin >> x;
			jia(1, 1, n, l, r, x);
		}
		else
		{
			cout << find(1, 1, n, l, r) << endl;
		}
	}
}
2024/5/18 23:00
加载中...