【宁夏区域赛】G.Pot!

 

题意:

给定两个操作:

MULTIPLY L R x  区间里都乘以一个数x

MAX L R : 计算区间内一个2,3,5,7个数最大值。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e5 + 10 ;
 4 int Max[N<<2][4] ;
 5 int Add[N<<2][4] ;
 6 
 7 const int prime[] = { 2 , 3 , 5 , 7 };
 8 
 9 void Push_Down( int Id , int val ){
10     if( Add[Id][val] ){
11         Add[Id << 1 ][ val ] += Add[ Id ][ val ];
12         Add[Id << 1 | 1 ][ val ] += Add[ Id ][ val ];
13 
14         Max[Id << 1 ][ val ] += Add[ Id ][ val ];
15         Max[Id << 1 | 1 ][ val ] += Add[ Id ][ val ];
16 
17         Add[Id][val] = 0 ;
18     }
19 }
20 
21 void Update( int Id ,int L , int R , int x , int y , int val ){
22     if( x <= L && R <= y ){
23         Max[Id][val] ++ ;
24         Add[Id][val] ++ ;
25         return ;
26     }
27     int Mid = L + R >> 1 ;
28     Push_Down( Id , val );
29 
30     if( x <= Mid ){
31         Update( Id << 1 , L , Mid , x , y , val );
32     }
33     if( Mid < y ){
34         Update( Id << 1 | 1 , Mid + 1 , R , x , y , val );
35     }
36 
37     Max[Id][val] = max( Max[ Id<<1 ][val] , Max[ Id<<1 | 1 ][val] );
38 }
39 
40 int Query( int Id , int L , int R , int x , int y ,int val ){
41     if( x <= L && R <= y ){
42         return Max[Id][val] ;
43     }
44     int Mid = L + R >> 1 ;
45     int res = 0 ;
46 
47     Push_Down( Id , val );
48     if( x <= Mid ){
49         res = max( res , Query( Id << 1 , L , Mid , x , y , val ) );
50     }
51     if( Mid < y ){
52         res = max( res , Query( Id << 1 | 1 , Mid+1 , R , x , y , val ) );
53     }
54     return res ;
55 }
56 
57 int main()
58 {
59     int n , Q ;
60     scanf("%d%d",&n,&Q);
61     while( Q-- ){
62         char s[10] ;
63         int L , R , x , res ;
64         scanf("%s",s);
65         if( s[1] == 'U' ){
66             scanf("%d%d%d",&L,&R,&x);
67             for( int i = 0 ; i < 4 ; i ++ ){
68                 if( x % prime[i] == 0 ){
69                     while( x % prime[i] == 0  ){
70                         Update( 1 , 1 , n , L , R , i );
71                         x /= prime[i] ;
72                     }
73                 }
74             }
75         }else{
76             scanf("%d%d",&L,&R);
77             res = 0 ;
78             for( int i = 0 ; i < 4 ; i++ ){
79                 int tmp = Query( 1 , 1 , n , L , R , i );
80                 if( tmp > res ) res = tmp ;
81             }
82             printf("ANSWER %d\n",res);
83         }
84     }
85     return 0;
86 }
Pot

 

posted @ 2019-10-22 21:36  Osea  阅读(258)  评论(0编辑  收藏  举报