BZOJ 1798 [Ahoi2009]Seq 維護序列seq 線段樹

來源:互聯網
上載者:User

標籤:2009   namespace   x   

題意:連結方法:線段樹解析:倆標記sb題更新乘的時候更新加完了代碼:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define N 100010using namespace std;typedef long long ll;ll mul[N<<2],sum[N<<2],add[N<<2];ll n,mod;int q;void pushup(int rt){    sum[rt]=(sum[rt<<1]+sum[rt<<1|1])%mod;}void pushdown(int rt,ll m){    if(mul[rt]!=1||add[rt]!=0)    {        mul[rt<<1]=(mul[rt<<1]*mul[rt])%mod;        mul[rt<<1|1]=(mul[rt<<1|1]*mul[rt])%mod;        add[rt<<1]=(mul[rt]*add[rt<<1]+add[rt])%mod;        add[rt<<1|1]=(mul[rt]*add[rt<<1|1]+add[rt])%mod;        sum[rt<<1]=(sum[rt<<1]*mul[rt]+(m-(m>>1))*add[rt])%mod;        sum[rt<<1|1]=(sum[rt<<1|1]*mul[rt]+(m>>1)*add[rt])%mod;        mul[rt]=1,add[rt]=0;    }}void build(int l,int r,int rt){    mul[rt]=1,sum[rt]=0;    if(l==r)    {        scanf("%I64d",&sum[rt]);        return;    }    int mid=(l+r)>>1;    build(lson),build(rson);    pushup(rt);}void update_mul(int L,int R,int l,int r,int rt,ll c){    if(L<=l&&r<=R)    {        mul[rt]=(mul[rt]*c)%mod;        add[rt]=(add[rt]*c)%mod;        sum[rt]=(sum[rt]*c)%mod;        return;    }    pushdown(rt,r-l+1);    int mid=(l+r)>>1;    if(L<=mid)update_mul(L,R,lson,c);    if(R>mid) update_mul(L,R,rson,c);    pushup(rt);}void update_add(int L,int R,int l,int r,int rt,ll c){    if(L<=l&&r<=R)    {        add[rt]=(add[rt]+c)%mod;        sum[rt]=(sum[rt]+(r-l+1)*c)%mod;        return;    }    pushdown(rt,r-l+1);    int mid=(l+r)>>1;    if(L<=mid)update_add(L,R,lson,c);    if(R>mid)update_add(L,R,rson,c);    pushup(rt);}ll query(int L,int R,int l,int r,int rt){    ll ret=0;    if(L<=l&&r<=R)    {        return sum[rt];    }    pushdown(rt,r-l+1);    int mid=(l+r)>>1;    if(L<=mid)ret=(ret+query(L,R,lson))%mod;    if(R>mid)ret=(ret+query(L,R,rson))%mod;    pushup(rt);    return ret;}int main(){    scanf("%lld%lld",&n,&mod);    build(1,n,1);    scanf("%d",&q);    while(q--)    {        int opt;scanf("%d",&opt);        int x,y;scanf("%d%d",&x,&y);        ll z;        switch(opt)        {            case 1:scanf("%lld",&z);update_mul(x,y,1,n,1,z);break;            case 2:scanf("%lld",&z);update_add(x,y,1,n,1,z);break;            case 3:printf("%lld\n",query(x,y,1,n,1));break;        }    }}

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

BZOJ 1798 [Ahoi2009]Seq 維護序列seq 線段樹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.