求大神帮找错,感觉和第一名的那个题解一模一样...就是找不到错 谢谢了Orz
查看原帖
求大神帮找错,感觉和第一名的那个题解一模一样...就是找不到错 谢谢了Orz
355016
docca0楼主2020/7/3 10:02
#include <stdio.h>
#include <queue>
#include <algorithm>
#include <vector>
#include<set>
#include <string.h>
using namespace  std;
int n,m,p;
struct node{
    long long  l,r,sum,mul_lz=1,add_lz=0;
}tree[500010];
int arr[100005];
void build(int id,int l,int r){
    tree[id].l=l;
    tree[id].r=r;
    if(l==r){
        tree[id].sum=arr[l];
        return;
    }
    int mid=(l+r)>>1;
    build(2*id,l,mid);
    build(2*id+1,mid+1,r);
    tree[id].sum=tree[2*id].sum+tree[2*id+1].sum;
}

void down(int id){
    tree[id*2].sum=(tree[id*2].sum*tree[id].mul_lz+(tree[id*2].r-tree[id*2].l+1)*tree[id].add_lz)%p;
    tree[id*2+1].sum=(tree[id*2+1].sum*tree[id].mul_lz+(tree[id*2+1].r-tree[id*2+1].l+1)*tree[id].add_lz)%p;

    tree[id*2].mul_lz=(tree[id*2].mul_lz*tree[id].mul_lz)%p;
    tree[id*2+1].mul_lz=(tree[id*2+1].mul_lz*tree[id].mul_lz)%p;
    tree[id*2].add_lz=(tree[id*2].add_lz*tree[id].mul_lz+tree[id].add_lz)%p;
    tree[id*2+1].add_lz=(tree[id*2+1].add_lz*tree[id].mul_lz+tree[id].add_lz)%p;

    tree[id].add_lz=0;
    tree[id].mul_lz=1;
}
void add(int id,int l,int r,int k){
    if(tree[id].l>r||tree[id].r<l)return;
    else if(tree[id].l>=l&&tree[id].r<=r){
        tree[id].add_lz+=k;
        tree[id].sum=(tree[id].sum+(tree[id].r-tree[id].l+1)*k)%p;
        return;
    }else
    {if(tree[id].add_lz>0||tree[id].mul_lz>1)down(id);
        add(id*2,l,r,k);
        add(id*2+1,l,r,k);
        tree[id].sum=(tree[id*2].sum+tree[id*2+1].sum)%p;
    }
}
void mul(int id,int l,int r,int k){
    if(tree[id].l>r||tree[id].r<l)return;
    else if(tree[id].l>=l&&tree[id].r<=r){
        tree[id].mul_lz=(k*tree[id].mul_lz)%p;
        tree[id].add_lz=(k*tree[id].add_lz)%p;
        tree[id].sum=(k*tree[id].sum)%p;
        return;
    }else
    {if(tree[id].add_lz>0||tree[id].mul_lz>1)down(id);
        mul(id*2,l,r,k);
        mul(id*2+1,l,r,k);
        tree[id].sum=(tree[id*2].sum+tree[id*2+1].sum)%p;
    }
}
long long search(int id,int l,int r){
    if(tree[id].l>r||tree[id].r<l)return 0;
    else if(tree[id].l>=l&&tree[id].r<=r)return tree[id].sum;
    else {
        if(tree[id].add_lz>0||tree[id].mul_lz>1)down(id);
        return (search(2*id,l,r)+search(2*id+1,l,r))%p;
    }
}
int main(int argc, char const *argv[])
{
    scanf("%d%d%d",&n,&m,&p);
    for(int i=1;i<=n;i++){
        scanf("%d",&arr[i]);
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int o,x,y,k;
        scanf("%d",&o);
        if(o==1){
            scanf("%d%d%d",&x,&y,&k);
            mul(1,x,y,k);
        }else if(o==2){
            scanf("%d%d%d",&x,&y,&k);
            add(1,x,y,k);
        }else{
            scanf("%d%d",&x,&y);
            printf("%lld\n",search(1,1,n));
        }
    }
    return 0;
}

2020/7/3 10:02
加载中...