• 【宁夏区域赛】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
    ",res);
    83         }
    84     }
    85     return 0;
    86 }
    Pot
  • 相关阅读:
    C语言I博客作业08
    博客作业6
    C语言I博客作业05
    C语言I博客作业03
    5.C#2.0之不完整类型(完成)
    4.C#2.0之迭代器(完成)
    3.C#2.0之匿名方法(完成)
    2.C#2.0之泛型(完成)
    1.C#2.0之2.0简介(完成)
    18.C#基础之不安全代码(完成)
  • 原文地址:https://www.cnblogs.com/Osea/p/11722736.html
Copyright © 2020-2023  润新知