zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    EMVTag系列15《选择应用响应数据》
    EMVTag系列14《支付环境响应数据》
    EMVTag系列13《脱机PIN》
    EMVTag系列9《卡片管理数据》
    EMVTag系列7《静态签名数据》
    EMVTag系列6《IAC 发卡行行为代码》
    EMVTag系列2《磁条等效数据》
    code1169 传纸条
    关于 变量越界
    code1039 数的划分
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8569122.html
Copyright © 2011-2022 走看看