社区讨论

求助线段树模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 条回复,欢迎继续交流。

正在加载回复...