求问,为什么差不多的代码,不同的RE···
#include <bits\stdc++.h>
using namespace std;
typedef int ll;
ll a[1001000] , add[1001000] , sum[1001000];
ll n , m;
void build( ll k , ll l , ll r )
{
if( l == r )
{
sum[k] = a[l];
return;
}
ll mid = l + r >> 1;
build( k * 2 , l , mid );
build( k*2+1 ,mid+1, r );
sum[k] = sum[ k * 2 ] + sum[ k * 2 + 1 ];
return ;
}
void add_sec( ll k , ll l , ll r , ll v )
{
add[k] += v;
sum[k] += ( r - l + 1 ) * v;
return ;
}
void pushdown( ll k , ll l , ll r , ll mid )
{
if( add[k] == 0 ) return ;
add_sec( k * 2 , l , mid , add[k] );
add_sec( k*2+1 ,mid+1, r , add[k] );
add[k] = 0;
}
ll quary( ll k , ll l , ll r , ll x , ll y )
{
if( x <= l && r <= y ) return sum[k];
ll mid = l + r >> 1;
ll res = 0;
pushdown( k , l , r , mid );
if( x <= mid ) res += quary( k * 2 , l , mid , x , y );
if( y > mid ) res += quary( k*2+1 ,mid+1, r , x , y );
return res;
}
void modify( ll k , ll l , ll r , ll x , ll y , ll v )
{
if( x <= l && r <= y )
{
add_sec( k , l , r , v );
}
ll mid = l + r >> 1;
pushdown( k , l , r , mid );
if( x <= mid ) modify( k * 2 , l , mid , x , y , v );
if( y > mid ) modify( k*2+1 ,mid+1, r , x , y , v );
sum[k] = sum[ k * 2 ] + sum[ k * 2 + 1 ];
return ;
}
int main()
{
ios::sync_with_stdio(false);
ll n , m;
cin >> n >> m;
for(int i = 1;i <= n;i ++)
{
cin >> a[i];
}
build( 1 , 1 , n );
int opt , x , y , k;
while( m -- )
{
cin >> opt;
if( opt == 1 )
{
cin >> x >> y >> k;
modify( 1 , 1 , n , x , y , k );
}
if( opt == 2 )
{
cin >> x >> y;
cout << quary( 1 , 1 , n , x , y ) << endl;
}
}
return 0;
}
#include <cstdio>
#include <iostream>
using namespace std;
int n , m , a[1001000];
int add[900900];
int sum[900900];
void build( int k , int l , int r )
{
if( l == r )
{
sum[k] = a[l];
return ;
}
int mid = ( l + r ) / 2;
build( k * 2 , l , mid );
build( k*2+1 ,mid+1, r );
sum[k] = sum[ k * 2 ] + sum[ k * 2 + 1 ];
}
void add_section( int k , int l , int r , int v )
{
add[k] += v;
sum[k] += v * ( r - l + 1 );
return ;
}
void pushdown( int k , int l , int r , int mid )
{
if( add[k] == 0 ) return ;
add_section( k * 2 , l , mid , add[k] );
add_section( k*2+1 ,mid+1, r , add[k] );
add[k] = 0;
}
int quary( int k , int l , int r , int x , int y )
{
if( x <= l && r <= y ) return sum[k];
int mid = ( l + r ) / 2;
int result = 0;
pushdown( k , l , r , mid );
if( x <= mid ) result += quary( k * 2 , l , mid , x , y );
if( y > mid ) result += quary( k*2+1 ,mid+1, r , x , y );
return result;
}
void modity( int k , int l , int r , int x , int y , int v )
{
if( x <= l && r <= y ) return add_section( k , l , r , v );
int mid = ( l + r ) / 2 ;
pushdown( k , l , r , mid );
if( x <= mid ) modity( k * 2 , l , mid , x , y , v );
if( y > mid ) modity( k*2+1 ,mid+1, r , x , y , v );
sum[k] = sum[ k * 2 ] + sum[ k * 2 + 1 ];
}
signed main()
{
scanf("%d%d",&n,&m);
for(int i = 1 ;i <= n;i ++ ) scanf("%d",&a[i]);
build( 1 , 1 , n );
while( m -- )
{
int x , y , k , in ;
scanf("%d",&in);
switch( in )
{
case 1:{
scanf("%d%d%d",&x,&y,&k);
modity( 1 , 1 , n , x , y , k );
break;
}
case 2:{
scanf("%d%d%d",&x,&y);
cout << quary( 1 , 1 , n , x , y ) << endl;
break;
}
}
}
return 0;
}
我要继续找 bug 啦 QAQ ,同时求 差不多写法的大神帮忙找找错~
ws