re求助

P3372 【模板】线段树 1

函数的参数错了 ```cpp build( 1 , 1 , n ) ; ``` -> ```cpp build( 1 , n , 1 ) ; ``` 其他的也错的,慢慢看吧
by lprer @ 2021-07-13 10:29:23


```cpp #include<bits/stdc++.h> using namespace std ; const int N = 1e5 + 10 ; struct edge { int l , r ; long long sum , add ; }tree[ N << 2 ] ; int a[N] , n , m ; void build( int p , int l , int r )//建树 { tree[p].l = l , tree[p].r = r ; if( l == r ) { tree[p].sum = a[l] ; return ; } int mid = ( l + r ) >> 1 ; build( p << 1 , l , mid ) ; build( p << 1 | 1 , mid + 1 , r ) ; tree[p].sum = tree[ p << 1 ].sum + tree[ p << 1 | 1 ].sum ; } void spread ( int p )//打延迟标记 { if( tree[p].add ) { tree[ p << 1 ].sum += tree[p].add * ( tree[ p << 1 ].r - tree[ p << 1 ].l + 1 ) ; //更新左子节点 tree[ p << 1 | 1 ].sum += tree[p].add * ( tree[ p << 1 | 1 ].r - tree[ p << 1 | 1 ].l + 1 ) ; //更新右子节点 tree[ p << 1 ].add += tree[p].add ; // 给左子节点打延迟标记 tree[ p << 1 | 1 ].add += tree[p].add ; //给右子节点打延迟标记 tree[p].add = 0 ; //清除p的标记 } } void change ( int p , int l , int r , int d ) //修改线段树 { if( l <= tree[p].l && r >= tree[p].r ) { tree[p].sum += ( long long )d * ( tree[p].r - tree[p].l + 1 ) ; //更新节点信息 tree[p].add += d ; //给节点打延迟标记 return ; } spread( p ) ; //下传延迟标记 int mid = ( tree[p].l + tree[p].r ) >> 1 ; if( l <= mid ) change( p << 1 , l , r , d ) ; if( r > mid ) change( p << 1 | 1 , l , r , d ) ; tree[p].sum = tree[ p<<1 ].sum + tree[ p << 1 | 1 ].sum ; } long long ask( int p , int l , int r ) //线段树的区间查询 { if( l <= tree[p].l && r >= tree[p].r ) return tree[p].sum ; spread( p ) ; //下传延迟标记 int mid = ( tree[p].l + tree[p].r ) >> 1 ; long long val = 0 ; if( l <= mid ) val += ask ( p << 1 , l , r ) ; if( r > mid ) val += ask ( p << 1 | 1 , l , r ) ; return val ; } int main(){ cin >> n >> m ; for(int i = 1 ; i <= n ; i++) cin >> a[i] ; build( 1 , 1 , n ) ; for(int i = 1 ; i <= m ; i++) { int q , x , y , z ; cin >> q ; if( q == 1 ) { cin >> x >> y >> z; change( 1 , x , y , z ) ; } else { cin >> x >> y ; cout << ask( 1 , x , y ) << endl ; } } return 0; } ``` ☺
by qnqfff @ 2021-07-13 10:42:05


|