社区讨论
一对一求调
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 条回复,欢迎继续交流。
正在加载回复...