線段樹模板(區(qū)間加、區(qū)間乘)


傳送門

題目描述

如題,已知一個(gè)數(shù)列狸棍,你需要進(jìn)行下面兩種操作:
1.將某區(qū)間每一個(gè)數(shù)加上x
2.將某區(qū)間每一個(gè)數(shù)乘上x
3.求出某區(qū)間每一個(gè)數(shù)的和

輸入輸出格式

輸入格式
第一行包含三個(gè)整數(shù)N鉴扫、M赞枕、P,分別表示該數(shù)列數(shù)字的個(gè)數(shù)坪创、操作的總個(gè)數(shù)和模數(shù)炕婶。
第二行包含N個(gè)用空格分隔的整數(shù),其中第i個(gè)數(shù)字表示數(shù)列第i項(xiàng)的初始值莱预。
接下來(lái)M行每行包含3或4個(gè)整數(shù)柠掂,表示一個(gè)操作,具體如下:
操作1: 格式:1 x y k 含義:將區(qū)間[x,y]內(nèi)每個(gè)數(shù)乘上k
操作2: 格式:2 x y k 含義:將區(qū)間[x,y]內(nèi)每個(gè)數(shù)加上k
操作3: 格式:3 x y 含義:輸出區(qū)間[x,y]內(nèi)每個(gè)數(shù)的和對(duì)P取模所得的結(jié)果
輸出格式
輸出包含若干行整數(shù)锁施,即為所有操作3的結(jié)果陪踩。

輸入輸出樣例

輸入樣例#1

5 5 38
1 5 4 2 3
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4

輸出樣例#1

17
2

說明

時(shí)空限制:1000ms,128M
數(shù)據(jù)規(guī)模:
對(duì)于30%的數(shù)據(jù):N<=8杖们,M<=10
對(duì)于70%的數(shù)據(jù):N<=1000,M<=10000
對(duì)于100%的數(shù)據(jù):N<=100000肩狂,M<=100000

思路

普通的線段樹模板摘完,只需要再加一個(gè)乘的標(biāo)記就行,但要注意在pushdowm的時(shí)候應(yīng)該先乘后加(你要不嫌麻煩寫一塊兒我也沒意見)傻谁,乘的時(shí)候加法標(biāo)記也要跟著乘

C++代碼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rr register
using namespace std;

typedef long long LL;
const int maxn=1e5+10;
int n,m,Q;
int a[maxn];

inline LL read(){//珂朵莉版快讀~~ 
    LL chtholly=0,willem=1;char c=getchar();
    while(c<'0' || c>'9'){if(c=='-')willem=-1;c=getchar();}
    while(c<='9' && c>='0'){chtholly=chtholly*10+(LL)(c-'0');c=getchar();}
    return chtholly*willem;
}

struct segment_tree{
#define lson (u<<1)
#define rson (u<<1|1)
    LL sum[maxn<<2],addv[maxn<<2],mul[maxn<<2],p;
    inline void pushup(int u){sum[u]=(sum[lson]+sum[rson])%p;}
    inline void build(int u,int l,int r){
        addv[u]=0,mul[u]=1;
        if(l==r){sum[u]=a[l];return;}
        int mid=(l+r)>>1;
        build(lson,l,mid);build(rson,mid+1,r);
        pushup(u);
    }
    inline void pushdown(int u,int lc,int rc){
        if(mul[u]!=1){
            addv[lson]=(addv[lson]*mul[u])%p;addv[rson]=(addv[rson]*mul[u])%p;
            mul[lson]=(mul[lson]*mul[u])%p;mul[rson]=(mul[rson]*mul[u])%p;
            sum[lson]=(sum[lson]*mul[u])%p;sum[rson]=(sum[rson]*mul[u])%p;
        }
        if(addv[u]!=0){
            addv[lson]=(addv[lson]+addv[u])%p;addv[rson]=(addv[rson]+addv[u])%p;
            sum[lson]=(sum[lson]+addv[u]*lc%p)%p;sum[rson]=(sum[rson]+addv[u]*rc%p)%p;
        }
        addv[u]=0,mul[u]=1;
    }
    inline void update_add(int u,int l,int r,int ql,int qr,int val){
        //區(qū)間加 
        if(ql<=l && r<=qr){
            sum[u]=(sum[u]+val*(r-l+1)%p)%p;
            addv[u]=(addv[u]+val)%p;
            return;
        }
        int mid=(l+r)>>1;
        pushdown(u,mid-l+1,r-mid);
        if(ql<=mid) update_add(lson,l,mid,ql,qr,val);
        if(qr>mid) update_add(rson,mid+1,r,ql,qr,val);
        pushup(u);
    }
    inline void update_mul(int u,int l,int r,int ql,int qr,int val){
        //區(qū)間乘 
        if(ql<=l && r<=qr){
            mul[u]=mul[u]*val%p;
            sum[u]=sum[u]*val%p;
            addv[u]=addv[u]*val%p;
            return;
        }
        int mid=(l+r)>>1;
        pushdown(u,mid-l+1,r-mid);
        if(ql<=mid) update_mul(lson,l,mid,ql,qr,val);
        if(qr>mid) update_mul(rson,mid+1,r,ql,qr,val);
        pushup(u);
    }
    inline LL query(int u,int l,int r,int ql,int qr){
        if(ql<=l && r<=qr)return sum[u];
        int mid=(l+r)>>1;
        pushdown(u,mid-l+1,r-mid);
        LL ret=0LL;
        if(ql<=mid) ret=(ret+query(lson,l,mid,ql,qr))%p;
        if(qr>mid) ret=(ret+query(rson,mid+1,r,ql,qr))%p;
        return ret%p;
    }
}tr;

int main(){
    n=read(),m=read(),tr.p=read();
    for(rr int i=1;i<=n;++i)a[i]=read();
    tr.build(1,1,n);
    while(m--){
        Q=read();
        int l=read(),r=read();
        if(Q==2){
            int x=read();
            tr.update_add(1,1,n,l,r,x);
        }
        if(Q==1){
            int x=read();
            tr.update_mul(1,1,n,l,r,x);
        }
        if(Q==3){
            LL ans=tr.query(1,1,n,l,r);
            printf("%lld\n",ans);
        }
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末孝治,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子审磁,更是在濱河造成了極大的恐慌谈飒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件态蒂,死亡現(xiàn)場(chǎng)離奇詭異杭措,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钾恢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門手素,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瘩蚪,你說我怎么就攤上這事泉懦。” “怎么了疹瘦?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵崩哩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我言沐,道長(zhǎng)邓嘹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任呢灶,我火速辦了婚禮吴超,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸯乃。我一直安慰自己鲸阻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布缨睡。 她就那樣靜靜地躺著鸟悴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奖年。 梳的紋絲不亂的頭發(fā)上细诸,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音陋守,去河邊找鬼震贵。 笑死利赋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猩系。 我是一名探鬼主播媚送,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寇甸!你這毒婦竟也來(lái)了塘偎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拿霉,失蹤者是張志新(化名)和其女友劉穎吟秩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绽淘,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涵防,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沪铭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片武学。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伦意,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硼补,我是刑警寧澤驮肉,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站已骇,受9級(jí)特大地震影響离钝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜褪储,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一卵渴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鲤竹,春花似錦浪读、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吱肌,卻和暖如春痘拆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氮墨。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工纺蛆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吐葵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓桥氏,卻偏偏與公主長(zhǎng)得像温峭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子识颊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 樹形動(dòng)態(tài)規(guī)劃诚镰,顧名思義就是樹+DP,先分別回顧一下基本內(nèi)容吧:動(dòng)態(tài)規(guī)劃:?jiǎn)栴}可以分解成若干相互聯(lián)系的階段祥款,在每一個(gè)...
    Mr_chong閱讀 1,491評(píng)論 0 2
  • 轉(zhuǎn)圈游戲 題目 n 個(gè)小伙伴(編號(hào)從 0 到 n-1)圍坐一圈玩游戲清笨。按照順時(shí)針方向給 n 個(gè)位置編號(hào),從0 到 ...
    bbqub閱讀 404評(píng)論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)刃跛。 張土汪:刷leetcod...
    土汪閱讀 12,748評(píng)論 0 33
  • 還是有懸而未決的事抠艾,還是有許多想了又想不知如何是好的事還是不能全力與愛的人恣意前行... 有時(shí)候會(huì)覺得“一地雞毛”...
    mo清夜無(wú)塵閱讀 78評(píng)論 0 1
  • 感覺自己像個(gè)動(dòng)物一樣,被觀摩桨昙,被嘲笑检号,像脫光了衣服站在人前,無(wú)地自容蛙酪!
    與二有緣的女孩閱讀 353評(píng)論 0 0