bzoj1798: [Ahoi2009]Seq 维护序列seq 线段树

来源:互联网 发布:淘宝购物流程步骤图 编辑:程序博客网 时间:2024/05/21 10:23

好久没有写线段树了,所以看到这个题就直接写了。。。

然后发现脑残了。一直TE。。。。。然后想起来只要往下乘的时候都换成ax+b就可以了。。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;#define getmid int mid=(l+r)>>1#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define maxn 500000typedef long long sint;sint sum[maxn];sint cal[maxn],add[maxn],mod;sint getsint(){    char c;sint res;    while(c=getchar(),c<'0'||c>'9');    res=c-'0';    while(c=getchar(),c>='0'&&c<='9')        res=res*10+c-'0';    return res;}int getint(){    char c;int res;    while(c=getchar(),c<'0'||c>'9');    res=c-'0';    while(c=getchar(),c>='0'&&c<='9')        res=res*10+c-'0';    return res;}void pushup(int rt){    sum[rt]=(sum[rt<<1]+sum[rt<<1|1])%mod;}void pushdown(int rt,int l,int r){        getmid;        add[rt<<1]=((add[rt<<1]*cal[rt])+add[rt])%mod;        add[rt<<1|1]=((add[rt<<1|1]*cal[rt])+add[rt])%mod;         cal[rt<<1]=(cal[rt<<1]*cal[rt])%mod;        cal[rt<<1|1]=(cal[rt<<1|1]%mod*cal[rt])%mod;        sum[rt<<1]=(sum[rt<<1]*cal[rt]+add[rt]*(mid-l+1))%mod;        sum[rt<<1|1]=(sum[rt<<1|1]*cal[rt]+add[rt]*(r-mid))%mod;         add[rt]=0;        cal[rt]=1;}void build(int l,int r,int rt){    getmid;    cal[rt]=1;    if(l==r)    {        sum[rt]=getint()%mod;        return;    }    build(lson);    build(rson);    pushup(rt);}void update(int l,int r,int rt,int x,int y,int val){    if(x<=l&&y>=r)    {        add[rt]+=val;        add[rt]%=mod;        sum[rt]=(sum[rt]+val*(r-l+1))%mod;        return;    }    pushdown(rt,l,r);    getmid;    if(x<=mid) update(lson,x,y,val);    if(y>mid) update(rson,x,y,val);    pushup(rt);}void multi(int l,int r,int rt,int x,int y,int val){    if(x<=l&&y>=r)    {        cal[rt]*=val;cal[rt]%=mod;        add[rt]*=val;add[rt]%=mod;        sum[rt]*=val;sum[rt]%=mod;        return;    }    pushdown(rt,l,r);    getmid;    if(x<=mid) multi(lson,x,y,val);    if(y>mid) multi(rson,x,y,val);    pushup(rt);}sint query(int l,int r,int rt,int x,int y){    if(x<=l&&y>=r)    {        return sum[rt]%mod;    }    pushdown(rt,l,r);    getmid;    sint tmp=0;    if(x<=mid) tmp+=query(lson,x,y);    if(y>mid) tmp+=query(rson,x,y);    tmp%=mod;    return tmp;}int main(){    int n,m;    scanf("%d%lld",&n,&mod);    build(1,n,1);    m=getint();    int op,a,b;    sint c;    while(m--)    {        op=getint();        if(op==1)        {            a=getint();            b=getint();            c=getsint()%mod;            multi(1,n,1,a,b,c);        }        if(op==2)        {            a=getint();            b=getint();            c=getsint()%mod;            update(1,n,1,a,b,c);        }        if(op==3)        {            a=getint();            b=getint();            printf("%lld\n",query(1,n,1,a,b)%mod);        }    }    return 0;}

0 0
原创粉丝点击