大佬求助呐!
  • 板块灌水区
  • 楼主StrFaith
  • 当前回复18
  • 已保存回复18
  • 发布时间2023/8/17 11:06
  • 上次更新2023/11/3 03:12:20
查看原帖
大佬求助呐!
970752
StrFaith楼主2023/8/17 11:06

这代码哪里有问题啊qwq

改了3天了

P3373,一道线段树模板

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,q,m;
const int maxn = 1e5+1;
int nod[maxn];      ll sum[maxn<<2];    int tag1[maxn<<2], tag2[maxn<<2];
void up(int n) {
    sum[n] = sum[n<<1] + sum[n<<1|1];
}
void down(int l, int r, int n) {
    int mid= (l + r) >>1;
    tag1[n<<1] = tag1[n<<1] * (tag1[n] % m);
    tag1[n<<1|1] = tag1[n<<1|1] * (tag1[n] % m);
    tag2[n<<1] = tag2[n<<1] * tag1[n<<1] + tag2[n];
    tag2[n<<1|1] = tag2[n<<1|1] * tag1[n<<1|1] + tag2[n];
    sum[n<<1] = (sum[n<<1] * tag1[n<<1] + (mid - l+1) * tag2[n<<1]) % m;
    sum[n<<1|1] = (sum[n<<1|1] * tag1[n<<1|1] + (mid - l+1) * tag2[n<<1|1]) % m;
    tag1[n] = 1;    tag2[n] = 0;
}
void build(int l , int r, int n) {
    if(l == r) {
        sum[n] = nod[l];
        return;
    }
    int mid = ( l + r) >>1;
    build(l, mid, n<<1);
    build(mid+1, r, n<<1|1);
    up(n);
}
void mul(int a, int b, int k,int l, int r, int n) {
    if(a <= l && r<= b) {
        tag1[n] *= k;
        sum[n] = (sum[n] * tag1[n] + ( r- l+1) * k) % m;
        return;
    }
    down(l, r, n);
    int mid = (l +r) >>1;
    if(mid >= a) mul(a, b, k, l, mid, n<<1);
    if(mid < b) mul (a, b, k, mid+1, r, n<<1|1);
    up(n);
}
void add(int a, int b,  int k ,int l ,int r, int n){
    if(a <= l && r <= b) {
        tag2[n] = tag2[n] * tag1[n] + k;
        sum[n] = (sum[n] * tag1[n] + ( r- l+1) * tag2[n]) % m;
        return ;
    }
    down(l, r, n);
    int mid = (l + r)>>1;
    if(mid >= a) add(a, b, k, l ,mid, n<<1);
    if( mid < b) add(a, b , k, mid+1, r, n<<1|1);
    up(n);
}
ll ask(int a, int b, int l, int r, int n){
    if(a <= l && r <= b) {
        return sum[n];
    }
    down(l,  r, n);
    int mid = ( l+r) >>1;       ll ans = 0;
    if(mid>= a) ans += ask(a, b, l, mid ,n<<1);
    if(mid < b) ans += ask(a, b, mid+1, r, n<<1|1);
}
void init() {
    memset(tag2, 0, sizeof(tag2));
    for(int i = 1; i <= (maxn<<2); i++) {
        tag1[i] = 1;
    }
}
int main () {
    freopen("ask.in" ,"r", stdin);
    //freopen("ask.out", "w", stdout);
    init();
    scanf("%d%d%d", &n, &q, &m);
    for(int i = 1; i<= n;i++)
        scanf("%d", &nod[i]);
    build(1, n ,1);
    while(q--) {
        int a, b, mm, k;
        scanf("%d%d%d", &mm, &a, &b);
        if(mm ==1)  {
            scanf("%d", &k);
            mul(a, b, k, 1, n, 1);
        }   if(mm ==2) {
            scanf("%d", &k);
            add(a, b, k, 1, n, 1);
        }   if(mm == 3){
            ll anss = ask(a, b, 1, n, 1) % m;
            printf("%lld\n", anss);
        }
    }
    return 0;
}

2023/8/17 11:06
加载中...