社区讨论
求助线段树模2 WA 30pts,一个月了还没过
P3373【模板】线段树 2参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo86b00v
- 此快照首次捕获于
- 2023/10/27 13:29 2 年前
- 此快照最后确认于
- 2023/10/27 13:29 2 年前
调了不知道多久了,蒟蒻实在想不到哪里还有错了
CPP//
// Created by 32373 on 2022/8/27.
//
//
// Created by 32373 on 2022/7/25.
//
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=100005;
ll st[MAXN*4], seq[MAXN], tag[MAXN*4], tag2[MAXN*4], mod, nun, qn;//tag加标记,tag2乘标记
inline ll ls(ll n){
return n << 1;
}
inline ll rs(ll n){
return n << 1 | 1;
}
void push_up(ll n){
st[n] = st[ls(n)] + st[rs(n)] % mod;
}
void build(ll p, ll l, ll r){
tag2[p] = 1;
tag[p] = 0;
if (l == r){
st[p] = seq[l];
return;
}
ll mid = (l+r) >> 1;
build(ls(p), l, mid);
build(rs(p), mid+1, r);
push_up(p);
}
void f(ll p, ll l, ll r, ll k, ll m){//加标记下传
st[p] *= m;
st[p] += k*(r-l+1);
st[p] %= mod;
tag[p] = tag[p] * m + k;
tag[p] %= mod;
}
void f2(ll p, ll l, ll r, ll k){ //乘标记下传
tag2[p] *= k;
st[p] %= mod;
}
void push_down(ll p, ll l, ll r){
ll mid=(l+r) >> 1;
f(ls(p), l, mid, tag[p], tag2[p]);
f(rs(p), mid+1, r, tag[p], tag2[p]);
f2(ls(p), l, mid, tag2[p]);
f2(rs(p), mid+1, r, tag2[p]);
tag[p] = 0;
tag2[p] = 1;
}
ll query(ll p, ll nl, ll nr, ll l , ll r){
if (l >= nl and r <= nr){
return st[p] % mod;
}
ll mid=(l+r) >> 1, res=0;
push_down(p, l, r);
if (nl <= mid)res += query(ls(p), nl, nr, l, mid) % mod;
if (nr > mid)res += query(rs(p), nl, nr, mid+1, r) % mod;
return res%mod;
}
void update(ll p, ll cl, ll cr, ll l, ll r, ll v, bool plus=true){
if (cl <= l and cr >= r){
if (not plus){ // 乘
tag[p] *= v;
tag[p] %= mod;
tag2[p] *= v;
tag2[p] %= mod;
st[p] *= v;
st[p] %= mod;
} else {//加
tag[p] += v;
tag[p] %= mod;
st[p] += (r-l+1)*v;
st[p] %= mod;
}
return;
}
ll mid=(l+r) >> 1;
push_down(p, l, r);
if (cl <= mid)update(ls(p), cl, cr, l, mid, v, plus);
if (cr > mid)update(rs(p), cl, cr, mid+1, r, v, plus);
push_up(p);
}
int main(){
for (int x=0;x<MAXN*4;++x){
tag[x] = 0, tag2[x] = 1;
}
// freopen("H:\\in.txt", "r", stdin);
// freopen("H:\\out.txt", "w", stdout);
ll op, tx, ty, tv;
scanf("%lld %lld %lld", &nun, &qn, &mod);
for (int x=1;x<=nun;++x){
scanf("%lld", &seq[x]);
}
build(1, 1, nun);
while (qn--){
scanf("%lld", &op);
if (op == 1){
scanf("%lld %lld %lld", &tx, &ty, &tv);
update(1, tx, ty, 1, nun, tv, false);
} else if (op == 2){ // plus
scanf("%lld %lld %lld", &tx, &ty, &tv);
update(1, tx, ty, 1, nun, tv);
} else {
scanf("%lld %lld", &tx, &ty);
printf("%lld\n", query(1, min(tx, ty), max(tx, ty), 1, nun) % mod);
}
}
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...