• bzoj1798


    题解:

    同洛谷2023

    代码:

    #include<bits/stdc++.h> 
    using namespace std;
    typedef long long ll;
    const int N=400005;
    ll p,v,sum_,addv[N],mulv[N],sumv[N],a[N];
    int n,m,c,x,y;
    void pushdown(int o,int l,int l1,int r,int r1)
    {
        sumv[o*2]=(sumv[o*2]*mulv[o]+addv[o]*(l1-l+1))%p;
        sumv[o*2+1]=(sumv[o*2+1]*mulv[o]+addv[o]*(r1-r+1))%p;
        addv[o*2]=(addv[o*2]*mulv[o]+addv[o])%p;
        addv[o*2+1]=(addv[o*2+1]*mulv[o]+addv[o])%p;
        mulv[o*2]=(mulv[o*2]*mulv[o])%p;
        mulv[o*2+1]=(mulv[o*2+1]*mulv[o])%p;
        mulv[o]=1;
        addv[o]=0;
    }
    void updatemul(int o,int l,int r)
    {    
        if(x<=l&&r<=y)
         {
            mulv[o]=(mulv[o]*v)%p;
            addv[o]=(addv[o]*v)%p;
            sumv[o]=(sumv[o]*v)%p;
            return ;
         }
        int mid=(l+r)>>1;
        pushdown(o,l,mid,mid+1,r);
        if(x<=mid)updatemul(o*2,l,mid);
        if(y>mid)updatemul(o*2+1,mid+1,r);
        sumv[o]=(sumv[o*2]+sumv[o*2+1])%p;
    }
    void updateadd(int o,int l,int r)
    {
        if(x<=l&&r<=y)
         {
            addv[o]=(addv[o]+v)%p;
            sumv[o]=(sumv[o]+v*(r-l+1))%p;
            return ;
         }
        int mid=(l+r)>>1;
        pushdown(o,l,mid,mid+1,r);
        if(x<=mid)updateadd(o*2,l,mid);
        if(y>mid)updateadd(o*2+1,mid+1,r);
        sumv[o]=(sumv[o*2]+sumv[o*2+1])%p;
    }
    void create(int o,int l,int r)
    {
        addv[o]=0;
        mulv[o]=1;
        if(l==r)
         {
            sumv[o]=a[l];
            return ;
         }
        int mid=(l+r)>>1;
        create(o*2,l,mid);
        create(o*2+1,mid+1,r);
        sumv[o]=(sumv[o*2]+sumv[o*2+1])%p;
    }
    void query(int o,int l,int r)
    {
        if(x<=l&&r<=y)
         {
            sum_+=sumv[o]%p;
            sum_%=p;
            return ;
         }
        int mid=(l+r)>>1;
        pushdown(o,l,mid,mid+1,r);
        if(x<=mid)query(o*2,l,mid);
        if(y>mid)query(o*2+1,mid+1,r);
        sumv[o]=(sumv[o*2]+sumv[o*2+1])%p;
    }
    int main()
    {
        scanf("%d%d",&n,&p);
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        create(1,1,n);
        scanf("%d",&m);
        while (m--)
         {
            scanf("%d%d%d",&c,&x,&y);
            if(c==1)
             {
                scanf("%d",&v);
                updatemul(1,1,n);
             }
            if(c==2)
             {
                scanf("%d",&v);
                updateadd(1,1,n);
             }
            if(c==3)
             {
                sum_=0;
                query(1,1,n);
                printf("%lld
    ",sum_);
             }
         }
        return 0;
    }
  • 相关阅读:
    怎么让图片居中显示?
    上传代码出现弹出框“请确保已在git中配置您的user.name和user.email”解决方法
    window.open()下载文件: 在当前页面打开方法
    修改网站颜色为黑白 (100% 灰度)/全页置灰
    ZMQ简单使用
    CCXT
    Python描述符详解
    自定义序列的修改、散列和切片
    使用__slots__类属性节省空间
    QGraphicsView实现虚拟摇杆
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8569122.html
Copyright © 2020-2023  润新知