社区讨论

IAKIOI!

学术版参与者 7已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@lyifidbr
此快照首次捕获于
2024/07/12 16:21
2 年前
此快照最后确认于
2024/07/12 17:00
2 年前
查看原帖

你被骗了

这个名字是吸引你点进来的
P3373 0分代码求调,样例已过,玄3关
CPP
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;
const ll N = 1e6 + 5;
const ll INF = 0x3f3f3f3f;
const ll eps = 1e-6;

typedef long long ll;

ll n, m, p;
ll tree[N], tag[N], mul[N], a[N];

ll ls(ll x) {
	return x << 1;
}
ll rs(ll x) {
	return x << 1 | 1;
}

void push_down(ll x, ll l, ll r) {
	if (mul[x] != 1) {
		mul[ls(x)] = (mul[ls(x)] * mul[x]) % p;
		mul[rs(x)] = (mul[rs(x)] * mul[x]) % p;
		tag[ls(x)] = (mul[ls(x)] * mul[x]) % p;
		tag[rs(x)] = (mul[rs(x)] * mul[x]) % p;
		tree[ls(x)] = (mul[ls(x)] * mul[x]) % p;
		tree[rs(x)] = (mul[rs(x)] * mul[x]) % p;
	}
	mul[x] = 1;
	if (tag[x]) {
		ll mid = (l + r) >> 1;
		tree[ls(x)] = (tree[ls(x)] % p + tag[x] % p * (mid - l + 1) % p) % p;
		tree[rs(x)] = (tree[rs(x)] % p + tag[x] % p * (r - mid) % p) % p;
		tag[ls(x)] = (tag[ls(x)] % p + tag[x] % p) % p;
		tag[rs(x)] = (tag[rs(x)] % p + tag[x] % p) % p;
	}
	tag[x] = 0;

}

void build(ll x, ll l, ll r) {
	mul[x] = 1;
	if (l == r) {
		tree[x] = a[l];
		return ;
	}
	ll mid = (l + r) >> 1;
	build(ls(x), l, mid);
	build(rs(x), mid + 1, r);
	tree[x] = tree[ls(x)] + tree[rs(x)];
}


void mul_update(ll x, ll l, ll r, ll L, ll R, ll k) {
	if (L <= l && r <= R) {
		mul[x] = (mul[x] * k) % p;
		tag[x] = (tag[x] * k) % p;
		tree[x] = (tree[x] * k) % p;
		return;
	}
	push_down(x, l, r);
	ll mid = (l + r) / 2;
	if (mid >= L) mul_update(ls(x), l, mid, L, R, k);
	if (mid + 1 <= R) mul_update(rs(x), mid + 1, r, L, R, k);
	tree[x] = tree[ls(x)] + tree[rs(x)];
	return;
}

void add_update(ll x, ll l, ll r, ll L, ll R, ll k) {
	if (L <= l && r <= R) {
		tree[x] += k * (r - l + 1) % p;
		tag[x] += k;
		return;
	}
	push_down(x, l, r);
	ll mid = (l + r) >> 1;
	if (mid >= L) add_update(ls(x), l, mid, L, R, k);
	if (mid + 1 <= R) add_update(rs(x), mid + 1, r, L, R, k);
	tree[x] = tree[ls(x)] + tree[rs(x)];
	return;
}

ll query(ll x, ll l, ll r, ll L, ll R) {
	if (L <= l && r <= R) return tree[x];
	ll mid = (l + r) >> 1;
	ll summ = 0;
	push_down(x, l, r);
	if (mid >= L) summ += query(ls(x), l, mid, L, R);
	if (mid + 1 <= R) summ += query(rs(x), mid + 1, r, L, R);
	return summ;
}


inline void solve() {

	cin >> n >> m >> p;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	build(1, 1, n);
	while (m--) {
		ll z, x, y, k;
		cin >> z;
		if (z == 1) {
			cin >> x >> y >> k;
			mul_update(1, 1, n, x, y, k);
			//		for(int i = 1;i <= n;i++) cout << tree[i] << " " << tag[i] << endl;
		}
		if (z == 2) {
			cin >> x >> y >> k;
			add_update(1, 1, n, x, y, k);
			//		for(int i = 1;i <= n;i++) cout << tree[i] << " " << tag[i] << endl;
		}
		if (z == 3) {
			cin >> x >> y;
			cout << query(1, 1, n, x, y) % p << endl;
		}
	}
	return ;
}

signed main() {
	ll T = 1;
	//cin>>T;
	solve();
}

回复

14 条回复,欢迎继续交流。

正在加载回复...