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、&)) (解きます)。 //} }