为什么啊啊啊啊啊
  • 板块灌水区
  • 楼主StrFaith
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/14 13:35
  • 上次更新2023/11/14 16:26:49
查看原帖
为什么啊啊啊啊啊
970752
StrFaith楼主2023/11/14 13:35

rt;为什么这个线段树模板题回答是错的????!!!! 不会要AFO了把

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+1;
int n, m, p;
long long sum[maxn << 2];
int tag1[maxn << 2], tag2[maxn << 2];
 long long node[maxn];
void up(int n) {
    sum[n] = (sum[n << 1] % p) + (sum[n <<1|1] % p);
}
void down(int l, int r, int n) {
    int mid = (l +r) >>1;
    if(tag2[n] != 1 || tag1[n]) {
        tag2[n<<1] = tag2[n << 1|1] = tag2[n];
        tag1[n << 1] = ( tag1[n <<1] * ( tag2[n] % p )  + tag1[n] % p) %p;
        tag1[n<< 1|1] = (tag1[n<< 1|1] * (tag2[n] % p ) + tag1[n] % p) %p;
        sum[n << 1] = sum[n << 1] * tag2[n] + (mid - l +1) * tag1[n <<1];
        sum[n << 1|1] = sum[n << 1|1] * tag2[n] + (r - mid ) * tag1[n<<1|1];
        tag2[n] = 1;
        tag1[n] = 0;
    }
}
void build(int l, int r, int n) {
    if(l == r){
        sum[n] = (node[l] % p);
        tag1[n] = 0;
        tag2[n] = 1;
        return;
    }
    int mid = (l + r) >>1;
    build(l, mid, n<<1);
    build(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) {
        tag1[n] += k % p;
        sum[n] += (r - l +1) *k %p;
        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);
}
void mul(int a, int b, int k, int l, int r, int n ){
    if(a <= l && r <= b) {
        tag2[n] = tag2[n] * (k % p) %p;
        tag1[n] *= k %p;
        sum[n] = (sum[n] % p) * (k % p);
        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);
}
long long  query(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;
    long long ans = 0;
    if(mid >= a) ans += (query(a, b, l, mid, n<<1) % p) %p;
    if(mid < b) ans += (query(a, b, mid+1, r, n<<1|1) % p) %p;
    return ans;
}
int main() {
    scanf("%d%d", &n, &m);
    scanf("%d", &p);
    for(int i = 1;i<= n;i++)
        scanf("%lld", &node[i]);
    build(1, n, 1);
    int a, b, k, mode;
    while(m--) {
        scanf("%d", &mode);
        if(mode == 1){
            scanf("%d%d%d", &a, &b, &k);
            add(a, b , k, 1, n, 1);
        }
        else if(mode == 2) {
            scanf("%d%d%d", &a, &b, &k);
            mul(a, b , k, 1, n, 1);
        }
        else {
            scanf("%d%d", &a, &b);
            long long ans = query(a, b, 1, n, 1) % p;
            printf("%lld\n", ans);
        }
    }
    return 0;
}

2023/11/14 13:35
加载中...