哪位大佬帮忙看看,谢谢!!!!

P3372 【模板】线段树 1

希望更丰富的展现?[使用Markdown](https://www.luogu.org/wiki/show?name=%E5%B8%AE%E5%8A%A9%EF%BC%9Amarkdown)
by pmt2018 @ 2019-06-02 15:41:55


@[zhanglinbo1](/space/show?uid=134663) 这让我们怎么看啊qwq
by Jelly_Goat @ 2019-06-02 15:46:41


希望更丰富的展现?请使用Markdown
by 陆小果 @ 2019-06-02 15:49:50


我...还是帮你改格式了吧 记得下次在代码上下加上箭头中间的东西 ```markdown -->```cpp<-- 你的代码 -->```<-- ``` 最后放上你的代码 ```cpp #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef long long int lli; int n, m; lli a[100010]; const int maxn = 100010; struct segtreenode { lli val, lazytag; }; segtreenode segtree[4 * maxn]; void build(lli rt, lli al, lli ar) { segtree[rt].lazytag = 0; if (al == ar) { segtree[rt].val = a[al]; return; } lli m = (al + ar) / 2; build(rt2, al, m); build(rt2 + 1, m + 1, ar); segtree[rt].val = segtree[rt2].val + segtree[rt2 + 1].val; } //建树 void pushdown(lli rt, lli al, lli ar) { lli m = (al + ar) / 2; if (segtree[rt].lazytag != 0) { segtree[rt2].val += segtree[rt].lazytag(m - al + 1); segtree[rt2 + 1].val += segtree[rt].lazytag(ar - m + 1 + 1); segtree[rt2].lazytag += segtree[rt].lazytag; segtree[rt2 + 1].lazytag += segtree[rt].lazytag; segtree[rt].lazytag = 0; } } void updata(lli rt, lli al, lli ar, lli ql, lli qr, lli val) { if (al > qr || ar < ql) return; if (al >= ql && ar <= qr) { segtree[rt].val += (val(ar - al + 1)); segtree[rt].lazytag += val; return; } pushdown(rt, al, ar); lli m = (al + ar) / 2; updata(rt2, al, m, ql, qr, val); updata(rt2 + 1, m + 1, ar, ql, qr, val); segtree[rt].val = segtree[rt2].val + segtree[rt2 + 1].val; return; //增加一个值 } lli ans = 0; lli query(lli rt, lli al, lli ar, lli ql, lli qr) //查询 { if (al > qr || ar < ql) return 0; if (al >= ql && ar <= qr) { return segtree[rt].val; } pushdown(rt, al, ar); lli m = (al + ar) / 2; return query(rt2, al, m, ql, qr) + query(rt2 + 1, m + 1, ar, ql, qr); } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) { scanf("%lld", &a[i]); } build(1, 1, n); for (int i = 1; i <= m; ++i) { int num; scanf("%d", &num); if (num == 1) { lli ql, qr, val; scanf("%lld%lld%lld", &ql, &qr, &val); updata(1, 1, n, ql, qr, val); ; } if (num == 2) { ans = 0; lli ql, qr; scanf("%lld%lld", &ql, &qr); ans = query(1, 1, n, ql, qr); printf("%lld\n", ans); } } return 0; } ```
by Jelly_Goat @ 2019-06-02 15:50:41


```cpp #include<iostream> #include<cstring> #include<algorithm> #include<stdio.h> #define MAXN 500000 using namespace std; struct node{ long long sum,lazy; long long left,right; }tree[MAXN]; long long a[MAXN]; void buildtree(long long id,long long l,long long r){ tree[id].left=l; tree[id].right=r; tree[id].lazy=0; if(l==r){ tree[id].sum=a[l]; return; } long long mid=(l+r)>>1; buildtree(id<<1,l,mid); buildtree(id<<1|1,mid+1,r); tree[id].sum=tree[id<<1].sum+tree[id<<1].lazy*(tree[id<<1].right-tree[id<<1].left+1)+ tree[id<<1|1].sum+tree[id<<1|1].lazy*(tree[id<<1|1].right-tree[id<<1|1].left+1); } void change(long long id,long long l,long long r,long long c){ if(tree[id].left==l&&tree[id].right==r){ tree[id].lazy+=c; return; } if(tree[id].lazy){ tree[id<<1].lazy+=tree[id].lazy; tree[id<<1|1].lazy+=tree[id].lazy; tree[id].lazy=0; } if(tree[id<<1].right>=r){ change(id<<1,l,r,c); } else if(tree[id<<1|1].left<=l){ change(id<<1|1,l,r,c); } else{ change(id<<1,l,tree[id<<1].right,c); change(id<<1|1,tree[id<<1|1].left,r,c); } tree[id].sum=tree[id<<1].sum+tree[id<<1].lazy*(tree[id<<1].right-tree[id<<1].left+1)+ tree[id<<1|1].sum+tree[id<<1|1].lazy*(tree[id<<1|1].right-tree[id<<1|1].left+1); return; } long long query(long long id,long long l,long long r){ if(tree[id].left==l&&tree[id].right==r){ return tree[id].sum+tree[id].lazy*(tree[id].right-tree[id].left+1); } if(tree[id].lazy){ tree[id<<1].lazy+=tree[id].lazy; tree[id<<1|1].lazy+=tree[id].lazy; tree[id].sum+=tree[id].lazy*(tree[id].right-tree[id].left+1); tree[id].lazy=0; } if(tree[id<<1].right>=r){ return query(id<<1,l,r); } else if(tree[id<<1|1].left<=l){ return query(id<<1|1,l,r); } else{ return query(id<<1,l,tree[id<<1].right)+ query(id<<1|1,tree[id<<1|1].left,r); } } int main() { long long n,m,p,x,y,z; scanf("%lld %lld",&n,&m); for(int i=1;i<=n;i++){ cin>>a[i]; } buildtree(1,1,n); for(long long i=1;i<=m;i++){ scanf("%d",&p); if(p==2) { scanf("%lld%lld",&x,&y); printf("%lld\n",query(1,x,y)); } else{ scanf("%lld%lld%lld",&x,&y,&z); change(1,x,y,z); } } return 0; } ``` 本蒟蒻的代码,好奇尾山漠很多人都卡死在这题上了~~
by charliegong @ 2019-06-02 15:55:21


@[Jelly_Goat](/space/show?uid=122927) 谢谢,这是我第一次发代码。 麻烦再帮我看一下那里错了吧。
by zhanglinbo1 @ 2019-06-02 16:00:07


@[zhanglinbo1](/space/show?uid=134663) 抱歉暂时有点忙碌
by Jelly_Goat @ 2019-06-02 16:02:42


@[zhanglinbo1](/space/show?uid=134663)
by charliegong @ 2019-06-02 16:06:44


|