求查错

P3372 【模板】线段树 1

```cpp #include <bits/stdc++.h> using namespace std; #define ll long long const int A = 100000+5; ll a[A]; ll c[4*A]; ll mark[A*4]; void push_down(ll x, ll len) { mark[x*2] += mark[x]; mark[x*2+1] += mark[x]; c[x*2] += mark[x] * (len - len/2); c[x*2+1] += mark[x] * (len/2); mark[x] = 0; } void push_up(ll x) { c[x] = c[2*x] + c[2*x+1]; } void build(ll l, ll r, ll x) { if(l==r) { c[x] = a[l]; return ; } build(l,(l+r)/2,2*x); build((l+r)/2+1,r,2*x+1); push_up(x); } long long Q(ll l, ll r, ll L, ll R, ll x) { if(L <= l and r <= R) return c[x]; ll mid = (l+r)/2; push_down(x,r-l+1); long long ans = 0; if(mid >= L) ans += Q(l,mid,L,R,2*x); if(mid < R) ans += Q(mid+1,r,L,R,2*x+1); return ans; } void upd(ll l, ll r, ll L, ll R, ll x, ll jia) { if(L > l and r > R) return ; if(L <= l and r <= R){ c[x] += (r-l+1)*jia; if(l!=r) mark[x] += jia; return ; } ll mid = (l+r)/2; push_down(x,r-l+1); upd(l,mid,L,R,2*x,jia); upd(mid+1,r,L,R,2*x+1,jia); push_up(x); } signed main() { ios::sync_with_stdio(false); int n, m; cin>>n>>m; for(int i = 1; i <= n; i++) cin>>a[i]; build(1,n,1); for(int i = 1; i <= m; i++) { ll t, x, y; cin>>t>>x>>y; if(t==1) { ll temp; cin>>temp; upd(1,n,x,y,1,temp); } else cout<<Q(1,n,x,y,1)<<endl; } return 0; } ```
by WRuperD @ 2021-07-17 15:30:54


`upd`写错了 ```cpp #include <bits/stdc++.h> using namespace std; #define ll long long const int A = 100000+5; ll a[A]; ll c[4*A]; ll mark[A*4]; void push_down(ll x, ll len) { mark[x*2] += mark[x]; mark[x*2+1] += mark[x]; c[x*2] += mark[x] * (len - len/2); c[x*2+1] += mark[x] * (len/2); mark[x] = 0; } void push_up(ll x) { c[x] = c[2*x] + c[2*x+1]; } void build(ll l, ll r, ll x) { if(l==r) { c[x] = a[l]; return ; } build(l,(l+r)/2,2*x); build((l+r)/2+1,r,2*x+1); push_up(x); } long long Q(ll l, ll r, ll L, ll R, ll x) { if(L <= l and r <= R) return c[x]; ll mid = (l+r)/2; push_down(x,r-l+1); long long ans = 0; if(mid >= L) ans += Q(l,mid,L,R,2*x); if(mid < R) ans += Q(mid+1,r,L,R,2*x+1); return ans; } void upd(ll l, ll r, ll L, ll R, ll x, ll jia) { if(L <= l and r <= R){ c[x] += (r-l+1)*jia; if(l!=r) mark[x] += jia; return ; } ll mid = (l+r)/2; push_down(x,r-l+1); if(L <= mid) upd(l,mid,L,R,2*x,jia); if(R > mid) upd(mid+1,r,L,R,2*x+1,jia); push_up(x); } signed main() { ios::sync_with_stdio(false); int n, m; cin>>n>>m; for(int i = 1; i <= n; i++) cin>>a[i]; build(1,n,1); for(int i = 1; i <= m; i++) { ll t, x, y; cin>>t>>x>>y; if(t==1) { ll temp; cin>>temp; upd(1,n,x,y,1,temp); } else cout<<Q(1,n,x,y,1)<<endl; } return 0; } ```
by _Emiria_ @ 2021-07-17 16:21:57


当然,也可以把 upd 里的 ```cpp if(L > l and r > R) return ; ``` 改为 ```cpp if(R < l || r < L) return ; ```
by Froranzen @ 2021-07-17 16:22:38


之前那位大佬的写法也是对的
by Froranzen @ 2021-07-17 16:22:59


@[椋枨](/user/361432) @[蒟蒻且网抑fks](/user/287868) thx
by WRuperD @ 2021-07-17 16:23:26


@[蒟蒻且网抑fks](/user/287868) sto,最优解第一页全是你,orz
by WRuperD @ 2021-07-17 16:25:38


@[椋枨](/user/361432) orz orz orz orz
by _Emiria_ @ 2021-07-17 16:28:43


@[蒟蒻且网抑fks](/user/287868) 假假
by Froranzen @ 2021-07-17 16:30:51


|