社区讨论

一对一求调

P2023[AHOI2009] 维护序列参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo8n1xrr
此快照首次捕获于
2023/10/27 21:17
2 年前
此快照最后确认于
2023/10/27 21:17
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std ;
const int Maxs = 200010 , TIL = ( 1 << 28 ) ;
struct Node { 
	int L , R ; 
	long long Sum ;
	long long NUM , ADD ;
} Tree[Maxs] ;
int N , A[Maxs] ;
long long P , Z ;
int OP , Q ;
int X , Y ;
void UP( int X ) { 
	Tree[X].Sum = ( Tree[X * 2].Sum + Tree[X * 2 + 1].Sum ) % P ; 
}
void ADD( int X , int L , int R ) {
	Tree[X] = { L , R , 0 , 1 , 0 } ;
	if( Tree[X].L == Tree[X].R ) { Tree[X].Sum = ( long long ) A[Tree[X].L] ; return ; } 
	int Mid = Tree[X].L + Tree[X].R >> 1 ;
	ADD( X * 2 , L , Mid ) ; ADD( X * 2 + 1 , Mid + 1 , R ) ;
	UP( X ) ;
}
void SHUP( int X , long long ADD , long long NUM ) {
	Tree[X].Sum = ( ( Tree[X].Sum * NUM ) % P + ( ( Tree[X].R - Tree[X].L + 1 ) * ADD ) % P ) % P ;
	Tree[X].ADD = ( ( Tree[X].ADD * NUM ) % P + ADD ) % P ;
	Tree[X].NUM = ( Tree[X].NUM * NUM ) % P ;
}
void DOWN( int X ) {
	SHUP( X * 2 + 1 , Tree[X].ADD , Tree[X].NUM ) ;
	SHUP( X * 2 , Tree[X].ADD , Tree[X].NUM ) ;
	Tree[X].ADD = 0 ; Tree[X].NUM = 1 ; 
} 
void Fix( int X , int L , int R , long long Z , int OP ) {
	cout << X << ' ' << Tree[X].L << ' ' << Tree[X].R << endl ;
	if( Tree[X].L == L && Tree[X].R == R ) {
		if( OP == 1 ) SHUP( X , 0 , Z ) ;
		else  SHUP( X , Z , 1 ) ;
		return ;
	} 
	DOWN( X ) ;
	int Mid = Tree[X].L + Tree[X].R >> 1 ;
	if( R <= Mid ) Fix( X * 2 , L , R , Z , OP ) ;
	else if( L >= Mid + 1 ) Fix( X * 2 + 1 , L , R , Z , OP ) ;
	else Fix( X * 2 , L , Mid , Z , OP ) , Fix( X * 2 + 1 , Mid + 1 , R , Z , OP ) ;
	UP( X ) ; 
}
long long Ans( int X , int L , int R ) {
	if( Tree[X].L == L && Tree[X].R == R ) return Tree[X].Sum ;
	DOWN( X ) ; UP( X ) ; 
	int Mid = Tree[X].L + Tree[X].R >> 1 ; 
	if( R <= Mid ) return Ans( X * 2 , L , R ) ; 
	else if( L >= Mid + 1 ) return Ans( X * 2 + 1 , L , R ) ; 
	else return ( Ans( X * 2 , L , Mid ) + Ans( X * 2 + 1 , Mid + 1 , R ) ) % P ; 
}
int main( ) {
	scanf("%d%lld" , &N , &P ) ; 
	for(int i = 1 ; i <= N ; i ++ ) scanf("%d" , &A[i]) ;
	ADD( 1 , 1 , N ) ; scanf("%d" , &Q ) ;
	while( Q -- ) {
		scanf("%d" , &OP ) ;	
		if( OP <= 2 ) scanf("%d%d%lld" , &X , &Y , &Z ) , Fix( 1 , X , Y , Z , OP ) ;
		else scanf("%d%d" , &X , &Y ) , printf("%lld\n" , Ans( 1 , X , Y ) ) ;
	}
	return false ;
} 

回复

2 条回复,欢迎继续交流。

正在加载回复...