分块 90pts 求调
查看原帖
分块 90pts 求调
1268478
時空楼主2024/8/1 10:56

RT, WA on #9

#include <bits/stdc++.h>

#define FstIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pb push_back
#define mem(a, v) memset(a, v, sizeof a)
#define pii pair<ll, ll>

using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
 
const ll N = 2e5 + 15, M = 2e6;
const ll mod = 1e9 + 7, mod2 = 998244353;
const ld eps = 1e-6;

ll n, q, m;

ll block, Len;

ll belong[N], L[N], R[N], Sum[N], mul[N], add[N];

ll Arr[N];

void build()
{
	Len = n / block; 
	if (n % block) ++ Len;
	for (ll i = 1; i <= Len; i ++ ) 
	{
		mul[i] = 1, add[i] = 0;
		L[i] = (i - 1) * block + 1, R[i] = i * block;
	}
	for (ll i = 1; i <= n; i ++ ) belong[i] = (i - 1) / block + 1;
	for (ll i = 1; i <= n; i ++ ) Sum[belong[i]] += Arr[i] % m; 
}

void mult(ll l, ll r, ll k)
{
	ll bl = belong[l], br = belong[r];
	if (bl == br)
	{
		if (add[bl] || mul[bl] != 1)
		{
			for (ll i = L[bl]; i <= R[bl]; i ++ )
			{
				Arr[i] = (Arr[i] * mul[bl] % m + add[bl]) % m;	
			} 
			Sum[bl] = (Sum[bl] * mul[bl] % m + add[bl] * block) % m;
			add[bl] = 0, mul[bl] = 1;
		}
		ll More = 0;
		for (ll i = l; i <= r; i ++ )
		{
			More = (More + Arr[i] * (k - 1)) % m, Arr[i] = (Arr[i] * k) % m;
		}
		Sum[bl] = (Sum[bl] + More) % m;
		return ;
	}
	if (add[bl] || mul[bl] != 1)
	{
		for (ll i = L[bl]; i <= R[bl]; i ++ ) 
		{
			Arr[i] = (Arr[i] * mul[bl] % m + add[bl]) % m;
		}
		Sum[bl] = (Sum[bl] * mul[bl] % m + add[bl] * block) % m;
		add[bl] = 0, mul[bl] = 1;
	}
	ll More = 0;
	for (ll i = l; i <= R[bl]; i ++ ) More = (More + Arr[i] *  (k - 1)) % m, Arr[i] = (Arr[i] * k) % m;
	Sum[bl] = (Sum[bl] + More) % m;
	
	if (add[br] || mul[br] != 1)
	{
		for (ll i = L[br]; i <= R[br]; i ++ ) 
		{
			Arr[i] = (Arr[i] * mul[br] % m + add[br]) % m;
		}
		Sum[br] = (Sum[br] * mul[br] % m + add[br] * block) % m;
		add[br] = 0, mul[br] = 1;
	}
	More = 0;
	for (ll i = L[br]; i <= r; i ++ ) More = (More + Arr[i] * (k - 1)) % m, Arr[i] = (Arr[i] * k) % m;
	Sum[br] = (Sum[br] + More) % m;
	
	for (ll i = bl + 1; i < br; i ++ )
	{
		mul[i] = (mul[i] * k) % m;
		add[i] = (add[i] * k) % m;
	}
}

void adds(ll l, ll r, ll k)
{
	ll bl = belong[l], br = belong[r];
	if (bl == br)
	{
		if (add[bl] || mul[bl] != 1)
		{
			for (ll i = L[bl]; i <= R[bl]; i ++ )
			{
				Arr[i] = (Arr[i] * mul[bl] + add[bl]) % m;	
			} 
			Sum[bl] = (Sum[bl] * mul[bl] + add[bl] * block) % m;
			add[bl] = 0, mul[bl] = 1;
		}
		for (ll i = l; i <= r; i ++ ) Arr[i] = (Arr[i] + k) % m;
		Sum[bl] = (Sum[bl] + (r - l + 1) * k) % m;
		return ;
	}
	if (add[bl] || mul[bl] != 1)
	{
		for (ll i = L[bl]; i <= R[bl]; i ++ )
		{
			Arr[i] = (Arr[i] * mul[bl] % m + add[bl]) % m;	
		} 
		Sum[bl] = (Sum[bl] * mul[bl] + add[bl] * block) % m;
		add[bl] = 0, mul[bl] = 1;
	}
	for (ll i = l; i <= R[bl]; i ++ ) Arr[i] = (Arr[i] + k) % m;
	Sum[bl] = (Sum[bl] + (R[bl] - l + 1) * k) % m; 
	
	if (add[br] || mul[br] != 1)
	{
		for (ll i = L[br]; i <= R[br]; i ++ )
		{
			Arr[i] = (Arr[i] * mul[br] + add[br]) % m;	
		} 
		Sum[br] = (Sum[br] * mul[br] % m + add[br] * block) % m;
		add[br] = 0, mul[br] = 1;
	}
	for (ll i = L[br]; i <= r; i ++ ) Arr[i] += k, Arr[i] %= m;
	Sum[br] = (Sum[br] + (r - L[br] + 1) * k) % m; 
	for (ll i = bl + 1; i < br; i ++ ) add[i] = (add[i] + k) % m;
}

ll Q(ll l, ll r)
{
	ll bl = belong[l], br = belong[r], ans = 0;
	if (bl == br)
	{
		for (ll i = l; i <= r; i ++ ) ans = (ans + Arr[i]) % m;
		ans = ans * mul[bl] % m + (r - l + 1) * add[bl] % m; ans %= m;
		return ans;
	}
	for (ll i = l; i <= R[bl]; i ++ ) ans = (ans + Arr[i]) % m;
	ans = ans * mul[bl] % m + (R[bl] - l + 1) * add[bl] % m; ans %= m;
	
	ll T = ans; ans = 0;
	
	for (ll i = L[br]; i <= r; i ++ ) ans = (ans + Arr[i]) % m;
	ans = ans * mul[br] % m + (r - L[br] + 1) * add[br] % m; ans %= m;
	ans += T; ans %= m;
	
	for (ll i = bl + 1; i < br; i ++ )
	{
		ans = (ans + Sum[i] * mul[i] % m + add[i] * block) % m;
	}
	return ans % m;
}

signed main()
{
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	FstIO; 

	cin >> n >> m; block = sqrt(n);
	for (ll i = 1; i <= n; i ++ ) cin >> Arr[i];
	cin >> q;
	build();
	while (q -- )
	{
		ll opt; cin >> opt;
		if (opt == 1)
		{
			ll x, y, k; cin >> x >> y >> k;
			mult(x, y, k);
		}
		else if (opt == 2)
		{
			ll x, y, k; cin >> x >> y >> k;
			adds(x, y, k);
		}
		else if (opt == 3)
		{
			ll x, y; cin >> x >> y;
			cout << Q(x, y) << '\n';
		}
	}
}
2024/8/1 10:56
加载中...