【洛谷 3372】线段树 1
題目描述
如題,已知一個(gè)數(shù)列,你需要進(jìn)行下面兩種操作:
1.將某區(qū)間每一個(gè)數(shù)加上x(chóng)
2.求出某區(qū)間每一個(gè)數(shù)的和
輸入格式
第一行包含兩個(gè)整數(shù)N、M,分別表示該數(shù)列數(shù)字的個(gè)數(shù)和操作的總個(gè)數(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 含義:輸出區(qū)間[x,y]內(nèi)每個(gè)數(shù)的和
輸出格式
輸出包含若干行整數(shù),即為所有操作2的結(jié)果。
輸入輸出樣例
輸入 #1復(fù)制 5 5 1 5 4 2 3 2 2 4 1 2 3 2 2 3 4 1 1 5 1 2 1 4 輸出 #1復(fù)制 11 8 20說(shuō)明/提示
時(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
(數(shù)據(jù)已經(jīng)過(guò)加強(qiáng)^_^,保證在int64/long long數(shù)據(jù)范圍內(nèi))
樣例說(shuō)明:
題解:復(fù)習(xí)一下線段樹(shù)咳咳咳,幾乎模板,但是我居然忘記在int main()里面調(diào)用build? ? ? ?我跟我旁邊的王同學(xué)找了好久。。。。氣死了嚶嚶嚶
// luogu-judger-enable-o2 #include<iostream> #include<algorithm> #include<queue> #include<cmath> #include<cstring> #include<cstdlib> #include<cstdio> using namespace std; const int N=100003; typedef long long ll; ll z,k,sum[N*4],add[N*4],a[N]; int n,akioi,x,y,biu;void pushup(int rt){sum[rt]=sum[rt*2]+sum[rt*2+1]; }void build(int l,int r,int rt){if(l==r){sum[rt]=a[l];return;}int m=(l+r)/2;build(l,m,rt*2);build(m+1,r,rt*2+1);pushup(rt); }void pushdown(int rt,int ln,int rn){if(add[rt]){add[rt*2]+=add[rt];add[rt*2+1]+=add[rt];sum[rt*2]+=add[rt]*ln;sum[rt*2+1]+=add[rt]*rn;add[rt]=0;} }ll query(int L,int R,int l,int r,int rt){if(L<=l && R>=r)return sum[rt];int m=(l+r)/2;pushdown(rt,m-l+1,r-m);ll ans=0;if(L<=m) ans+=query(L,R,l,m,rt*2);if(R> m) ans+=query(L,R,m+1,r,rt*2+1);return ans; }void update(int L,int R,ll k,int l,int r,int rt){if(L<=l && R>=r){sum[rt]+=k*(r-l+1);add[rt]+=k;return ; } int m=(l+r)/2;pushdown(rt,m-l+1,r-m);if(L<=m) update(L,R,k,l,m,rt*2);if(R>m) update(L,R,k,m+1,r,rt*2+1);pushup(rt); }int main(){scanf("%d %d",&n,&akioi);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);build(1,n,1);while(akioi--){//cout<<7666;scanf("%d",&biu);if(biu==2){scanf("%d %d",&x,&y);printf("%lld\n",query(x,y,1,n,1));}else{scanf("%d %d %lld",&x,&y,&z);update(x,y,z,1,n,1);}}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/wuhu-JJJ/p/11324509.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的【洛谷 3372】线段树 1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 25岁之后,你更应该逼自己系统性成长
- 下一篇: Linux 内核链表 【转】