求问(找不同)
  • 板块灌水区
  • 楼主欢黎明陌
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/5/20 13:34
  • 上次更新2023/11/4 23:02:46
查看原帖
求问(找不同)
402211
欢黎明陌楼主2021/5/20 13:34

P3372 【模板】线段树 1

求问,为什么差不多的代码,不同的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;
}



我要继续找 bugbugQAQQAQ ,同时求 差不多写法的大神帮忙找找错~

wsws

2021/5/20 13:34
加载中...