社区讨论
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 条回复,欢迎继续交流。
正在加载回复...