P2023 [AHOI2009]维护序列 区间加乘模板

摘要:
题意:有长为N的数列,不妨设为a1,a2,…思路:线段树,因为有可能存在,同时加和乘,所以lazy标记变为二维,一个记录乘,一个记录加因为乘是总和乘一个数,所以先乘再加,这里需要注意,因为原本的区间和可能是zhi+lazy,乘是总体,所以标记lazy也要乘ilvoidpushdown{if(lazy[x][1]!=0){intmid=(l+r)˃˃1;tree[x˂˂1]+=*lazy[x][0];tree[x˂˂1]%=mod;tree[x˂˂1|1]+=*lazy[x][0];tree[x˂˂1|1]%=mod;lazy[x˂˂1][0]+=lazy[x][0];lazy[x˂˂1][0]%=mod;lazy[x˂˂1|1][0]+=lazy[x][0];lazy[x˂˂1|1][0]%=mod;lazy[x][0]=0;}}这题也wa了好多遍,直到最后相通了,当加和乘同时存在的时候#includeusingnamespacestd;#definelllonglong#defineilinline#defineitregisterint#defineinf0x3f3f3f3f#definelowbit&(-x)#definemem(a,b)memset#definemodd998244353constintmaxn=2e5+10;intn,m,k;llp;lltree[maxn˂˂2],lazy[maxn˂˂2][2],a[maxn];ilvoidpushdown{if(lazy[x][1]!

题意:

有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式:N<=1e5
(1)把数列中的一段数全部乘一个值;
(2)把数列中的一段数全部加一个值;
(3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。

思路:

线段树,因为有可能存在,同时加和乘,所以lazy标记变为二维,一个记录乘,一个记录加

因为乘是总和乘一个数,所以先乘再加,这里需要注意,因为原本的区间和可能是zhi+lazy【加】,乘是总体,所以标记lazy【加】也要乘

 il void pushdown(int x,ll mod,int l,intr){
     if(lazy[x][1]!=1){
         tree[x<<1]*=lazy[x][1];tree[x<<1]%=mod;
         tree[x<<1|1]*=lazy[x][1];tree[x<<1|1]%=mod;
         lazy[x<<1][1]*=lazy[x][1];lazy[x<<1][1]%=mod;
         lazy[x<<1|1][1]*=lazy[x][1];lazy[x<<1|1][1]%=mod;
         lazy[x<<1][0]*=lazy[x][1];lazy[x<<1][0]%=mod;
         lazy[x<<1|1][0]*=lazy[x][1];lazy[x<<1|1][0]%=mod;
         lazy[x][1]=1;
    }
     if(lazy[x][0]!=0){
         int mid=(l+r)>>1;
         tree[x<<1]+=(mid-l+1)*lazy[x][0];tree[x<<1]%=mod;
         tree[x<<1|1]+=(r-mid)*lazy[x][0];tree[x<<1|1]%=mod;
         lazy[x<<1][0]+=lazy[x][0];lazy[x<<1][0]%=mod;
         lazy[x<<1|1][0]+=lazy[x][0];lazy[x<<1|1][0]%=mod;
         lazy[x][0]=0;
     }
 }

这题也wa了好多遍,直到最后相通了,当加和乘同时存在的时候

P2023 [AHOI2009]维护序列 区间加乘模板第1张

#include<bits/stdc++.h>
using namespacestd;
#define ll long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define mem(a,b) memset(a,b,sizeof(a))
#define modd 998244353
const int maxn=2e5+10;
intn,m,k;
ll p;
ll tree[maxn<<2],lazy[maxn<<2][2],a[maxn];
il void pushdown(int x,ll mod,int l,intr){
    if(lazy[x][1]!=1){
        tree[x<<1]*=lazy[x][1];tree[x<<1]%=mod;
        tree[x<<1|1]*=lazy[x][1];tree[x<<1|1]%=mod;
        lazy[x<<1][1]*=lazy[x][1];lazy[x<<1][1]%=mod;
        lazy[x<<1|1][1]*=lazy[x][1];lazy[x<<1|1][1]%=mod;
        lazy[x<<1][0]*=lazy[x][1];lazy[x<<1][0]%=mod;
        lazy[x<<1|1][0]*=lazy[x][1];lazy[x<<1|1][0]%=mod;
        lazy[x][1]=1;
    }
    if(lazy[x][0]!=0){
        int mid=(l+r)>>1;
        tree[x<<1]+=(mid-l+1)*lazy[x][0];tree[x<<1]%=mod;
        tree[x<<1|1]+=(r-mid)*lazy[x][0];tree[x<<1|1]%=mod;
        lazy[x<<1][0]+=lazy[x][0];lazy[x<<1][0]%=mod;
        lazy[x<<1|1][0]+=lazy[x][0];lazy[x<<1|1][0]%=mod;
        lazy[x][0]=0;
    }
}
il void pushup(intx,ll mod){
    tree[x]=(tree[x<<1]+tree[x<<1|1])%mod;
}
void build(int x,int l,intr,ll mod){
    lazy[x][1]=1;lazy[x][0]=0;
    if(l==r){
        tree[x]=a[l];return;
    }
    int mid=(l+r)>>1;
    build(x<<1,l,mid,mod);
    build(x<<1|1,mid+1,r,mod);
    pushup(x,mod);
}
void updatej(int x,int l,int r,int l1,intr1,ll zhi,ll mod){
    if(l1<=l && r<=r1){
        pushdown(x,mod,l,r);
        lazy[x][0]=zhi;tree[x]+=(ll)(r-l+1)*zhi;tree[x]%=mod;
        return;
    }
    pushdown(x,mod,l,r);
    int mid=(l+r)>>1;
    if(l1<=mid){
        updatej(x<<1,l,mid,l1,r1,zhi,mod);
    }
    if(r1>mid){
        updatej(x<<1|1,mid+1,r,l1,r1,zhi,mod);
    }
    pushup(x,mod);
}
void updatec(int x,int l,int r,int l1,intr1,ll zhi,ll mod){
    if(l1<=l && r<=r1){
        pushdown(x,mod,l,r);
        lazy[x][1]=zhi;tree[x]*=zhi;tree[x]%=mod;
        return;
    }
    pushdown(x,mod,l,r);
    int mid=(l+r)>>1;
    if(l1<=mid){
        updatec(x<<1,l,mid,l1,r1,zhi,mod);
    }
    if(r1>mid){
        updatec(x<<1|1,mid+1,r,l1,r1,zhi,mod);
    }
    pushup(x,mod);
}
ll query(int x,int l,int r,int l1,intr1,ll mod){
    if(l1<=l && r<=r1){
       returntree[x];
    }
    pushdown(x,mod,l,r);
    int mid=(l+r)>>1;
    ll sum=0;
    if(l1<=mid){
        sum+=query(x<<1,l,mid,l1,r1,mod);sum%=mod;
    }
    if(r1>mid){
        sum+=query(x<<1|1,mid+1,r,l1,r1,mod);sum%mod;
    }
    return sum%mod;
}
intmain(){
    scanf("%d%lld",&n,&p);
    for(it i=1;i<=n;i++){
        scanf("%lld",&a[i]);a[i]%=p;
    }
    build(1,1,n,p);

    scanf("%d",&m);
    while(m--){//cout<<tree[1]<<endl;
        intt,g;
        ll c;
        scanf("%d",&k);
        if(k==1){
            scanf("%d%d%lld",&t,&g,&c);
            updatec(1,1,n,t,g,c%p,p);
        }
        else if(k==2){
            scanf("%d%d%lld",&t,&g,&c);
            updatej(1,1,n,t,g,c%p,p);
        }
        else{
            scanf("%d%d",&t,&g);
            printf("%lld
",query(1,1,n,t,g,p));
        }
    }
    return 0;
}

免责声明:文章转载自《P2023 [AHOI2009]维护序列 区间加乘模板》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇springboot不使用parent的方式管理jarVue项目发布注意事项下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Jdk升级到11引起的问题:程序包javax.xml.bind.annotation不存在

您可以看到ELDict类中有一个引用:importjavax。xml。绑定注释XmlAttribute;虽然未使用,但它会导致mvn编译错误。在在线绑定中搜索“包javax.xml.bind.nannotation不存在”。结果是:包javax。xml。bind Annotation不存在-CSDN论坛2009年12月2日·无法编译使用jaxb的类,因为软件...

JRebel 6 破解版及使用方法

2.解压下载的jrebel6.0.0-crack.zip、jrebel6.0 jar包和破解文件。假设文件在D:/jrebel步骤:1中解压缩。eclipse下载jrebe插件,可以在市场上下载。2.打开eclipse的窗口首选项jrebel,打开优势选项卡,并将jar包的路径指向D:/jrebel/jrebel.jar。用CMD打开DOS窗口,输入cd/d...

图论介绍(Graph Theory)

G-v具有比G更多的连通分支,因此v被称为G的截断点G-e具有比G多的连通分支。定理:连通图G,其中e是桥e不属于G的任何环有顶点u,v,使得任何路径u-v都通过e连通图G;而w是存储在顶点u,v处的割点,使得任意路径u-v通过w定义:顶点之间的距离x-y:所有x-y路径的最小长度。...

node 访问第三方API

如果没有提供头,将检测文件后缀,并在PUT请求中设置相应的内容类型。...

vue升级Babel支持可选链和合并空值运算符

据我所知,无论是webpack项目还是vite项目都需要使用到babel来编译文件。currentItem:tips;}//template使用传入对应的取值地址:string{{text_filter}}其他可玩的ES新特性通过babel的官网,我们可以看到babel支持的"ES新特性"参考:babeljs.io/docs/en/plu…挑几个有意思的说明...

Jquery.i18n使用技巧(一)

最近第一次使用i18n插件,很好用,方法很简单。我就不介绍什么i18n的来历了,自己百度。直接说使用方法:1.从官网获取到jquery.i18nhttps://code.google.com/p/jquery-i18n-properties/downloads/list2.配置目录如下:引入i18n即可,这里注意两点:1.引入jquery库必须在之前引入2....