セグメントツリー(最大間隔更新+範囲)

https://nanti.jisuanke.com/t/42387

問題の意味:N(1 <= N <= 1E5)数、最初に1 Q(1 <= Q <= 1E5)クエリ回、両方。1、MUL L、R、X区間[L、R]は(1 <=は、x <= 10)xで乗算されます。2、クエリL、R問い合わせ区間[L、R]の最大インデックスの各素因数分解の最大値。

溶液:問題のノウハウを理解した後は、各間隔の統計の素数(2、3、5、7)数、各素数のインデックス番号の最大値の最大値の範囲内です。

(2,3,5,7-)統計は、最大4本の木における素数の数、クエリの最大範囲すべての木が、答えは4つのツリーラインのメンテナンスです。

#include <ビット/ STDC ++。H> 
の#include <cstdioを> 
する#include <CStringの> 
する#include <cmath> 
の#include <アルゴリズム> 
の#include <iostreamの> 
する#include <ストリング> 
する#include <stdio.hに> 
する#include <キュー> 
の#include <スタック> 
の#include <マップ> 
の#include <セット> 
の#include <string.hの> 
する#include <ベクトル> 
のtypedef長い長LL。
#define INT LL 
の#define MOD 1000000007 
の#define GCD __gcd 
の#define REPは(i、jは、N)のための(INT iがjは=; I <= N; I ++)
赤の#define(I、N、j)のための(INT I = N; I> = J; i--)
の#define ME(x、y)はmemsetの(X、Y、はsizeof(x))を 
// LL LCM(LL、
一方、(B){IF(B&1)ANS = ANS *%のMOD; //は(-1,11,11- B){LL ANS = 1をquickpowちゃうB >> = 1、A = A *%のMOD;}リターンANS;} 
// INT euler1(INT X){int型ANS = X;(; iは<= X *; INT iは2 = I ++)のためのIF(X%I == 0){ans- = ANS / I。一方、(X%I == 0)は、x / = I;}もし(X> 1)ans- = ANS / X;戻りANS;} 
// CONST INT N = 1E7 + 9。INT VIS [n]は、素数[n]は、PHI [N]; int型euler2(INT N){ME(VIS、TRUE); INT LEN = 1;担当者(I、2、N){IF(VIS [I] ){プライム[LEN ++] = I、PHI [i]は= I-1;}の(INT J = 1; J <LEN &&プライム[J] * I <= nであり、j ++){VIS [i *が素数[J] = 0;(I%プライム[j] == 0){;ブレーク; PHI [I *プライム[J] = PHI [I] *プライム[J]}もしそうでなければ{PHI [iが素数[Jを*]] = PHI [I] * PHI [プライム[J]];}}}戻りLEN} 
の#define INF 0x3f3f3f3f 
の#define PI ACOS(-1)
の#define PII対<整数、整数> 
の#define Fiの第一
の#define SE第二
# L、中間ルートをLSON定義<< 1つ
の#define rsonミッド+ 1、R、根<<
#define MP make_pair 
の#define CIN(X)のscanf( "%のLLD"、&x)は、
名前空間stdを使用。
CONST INT N = 1E7 + 9。
const int型MAXN = 1E5 + 9。
constのダブルESP = 1E-2; 
INT Q、N。
チャーS [20]。
構造体ノード{ 
    INT L、R、MA、怠惰。
}。
構造体Segment_Tree { 
    ドノードツリー[MAXN << 2]。
    ボイド押し上げ(INTルート){ 
        ツリー[ルート] .val =ツリー[ルート>> 1] .val +ツリー[ルート>> 1 | 1] .val。
        ツリー[ルート] .ma = MAX(ツリー[ルート<< 1] .ma、ツリー[ルート<< 1 | 1] .ma)。
    } 
    ボイドプッシュダウン(INTルート){ 
        ツリー[ルート<< 1] .ma + =ツリー[ルート] .lazy。
        ツリー[ルート<< 1 | 1] .ma + =ツリー[ルート] .lazy。
        ツリー[ルート<< 1] .lazy + =ツリー[ルート] .lazy。
        ツリー[ルート<< 1 | 1] .lazy + =ツリー[ルート] .lazy。
        ツリー[ルート] .lazy = 0。
    } 
    ボイドビルド(int型のL、R INT、INTルート){ 
        ツリー[ルート] .L = L、木[ルート] .R = R、ツリー[ルート] .val = 0、ツリー[ルート] .lazy = 0、ツリー[ルート] .ma = 0。
        IF(L == R){ 
            リターン。
        } 
        int型のミッド=(L + R)>> 1。
        ビルド(LSON)。
        ビルド(rson)。
    } 
    ボイド更新(int型のL、R INT、INT根、INT VA){ 
        IF(ツリー[ルート] .L> = L &&ツリー[ルート] .R <= R){ 
            ツリー[ルート] .lazy + = VA。
            ツリー[ルート] .ma + = VA。
            リターン;
        }
        もし(R>中旬) 
        IF(ツリー[ルート] .lazy)プッシュダウン(ルート)。
        INT半ば=(ツリー[ルート] .L +ツリー[ルート] .R)>> 1。
        IF(L <= MID)
            更新(L、R、根<< 1、VA)。
        IF(R> MID)
            更新(L、R、根<< 1 | 1、VA)。
        突き上げ(ルート)。
    } 
    INTクエリ(INT L、R INT、INTルート){ 
        int型MA = -INF。
        IF(ツリー[ルート] .L> = L &&ツリー[ルート] .R <= R){ 
            戻りツリー[ルート] .ma。
        } 
        IF(ツリー[ルート] .lazy)プッシュダウン(ルート)。
        INT半ば=(ツリー[ルート] .L +ツリー[ルート] .R)>> 1。
        IF(中間> = 1)
            MA = MAX(MA、クエリ(L、R、根<< 1))。
            MA = MAX(MA、クエリ(L、R、根<< 1 | 1))。

    } 
} PR2、PR3、PR5、PR7。

{()解決無効
    scanf関数を( "%LLD%LLD"、&N、&Q)。
    pr2.build(1、nは、1)。
    pr3.build(1、nは、1)。
    pr5.build(1、nは、1)。
    pr7.build(1、nは、1)。
    担当者(I 1、Q){ 
        scanf関数( "%s"は、単数または複数); 
        IF(S [0] == 'M' && S [1] == 'U'){ 
            int型のL、R、X。
            scanf関数( "%LLD%LLD%LLD"、&L&R&X)。
            もし(x == 2){ 
                pr2.update(L、R、1,1)。
            }そうであれば(x == 3){ 
                pr3.update(L、R、1,1)。
            }そうであれば(X == 4){
                pr2.update(L、R、1,2)。
            }そうであれば(x == 5){ 
                pr5.update(L、R、1,1)。
            }そうであれば(X == 6){ 
                pr2.update(L、R、1,1)。
                pr3.update(L、R、1,1)。
            }そうであれば(X == 7){ 
                pr7.update(L、R、1,1)。
            }そうであれば(X == 8){ 
                pr2.update(L、R、1,3)。
            }そうであれば(X == 9){ 
                pr3.update(L、R、1,2)。
            }そうであれば(X == 10){ 
                pr2.update(L、R、1,1)。
                pr5.update(L、R、1,1)。
            } 
        }他{ 
            INT L、R。
            int型ANS = -1; 
            scanf関数( "%LLD%LLD"、&L&R)。
            ANS = MAX(ANS、pr2.query(L、R、1))。
            ANS = MAX(ANS、pr3.query(L、R、1))。
            ANS = MAX(ANS、pr5.query(L、R、1))。
            ANS = MAX(ANS、pr7.query(L、R、1))。
            printf( "回答%のLLD \ n"は、ANS)。
        } 
    } 
} 

署名されたメイン()
{ 
    // IOS :: sync_with_stdio(偽)。
    //cin.tie(0); cout.tie(0)。
    // int型トン。
    // CIN(T); 
    //一方、(T - ){ 
    //ながら(〜のscanf( "%LLD%LF"、&N、&)) 解きます)。
    //} 
}

 

おすすめ

転載: www.cnblogs.com/nonames/p/12463010.html