+クエリセグメントツリーソート部のE - 痛みノーゲーム分野ツリーの順序オフライン処理間隔

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

被験者は、より多くの暴力把握するのは難しいではありませんが、計算の複雑であるためには、計算の複雑さは、実際にはない、出て彼らのアルゴリズムの時間と感じるだろうしません。

このトピックでは、以前に書き込まれたとして、1E5未満で数とすべての数の倍数を取得した後、更新するすべての直接の暴力についてです注文痛みはありませんゲーム分野ツリーのオフライン処理部- E  と同じに

LOGNについてですそれぞれの数についての平均ので、高調波シリーズは、複数追求する時間の数について尋ねるために1回、2回使用し、複雑さがn *のLOGNある複雑さをカウント 

二重の関係がありますので、そのように2 * LOGN

ツリーラインの複雑さ、および各更新は、時間を横断する、LOGNあります

そのため、全体的な複雑さは、これは確かにタイムアウトしない、2 * n個* LOGNの*のLOGNです。

書式#include <cstdioを> 
する#include <CStringの> 
の#include <cstdlib> 
書式#include <キュー> 
の#include <アルゴリズム> 
書式#include <iostreamの>
 に#define 0x3f3f3f3f INF
 使用して 名前空間はstdを、
const  int型 MAXN = 1E5 + 10 
typedefの長い 長いLL。
ベクター < INT > NUM [MAXN]。
int型[MAXN]、VIS [MAXN]、[MAXN] C、[MAXN] ANS。
INTのN、M。
構造体ノード
{ 
    int型のL、R、ID。
    ノード(int型L = 0INT R = 0INT ID = 0 )、L(リットル)、R(r)は、ID(ID){} 
} EX [MAXN]。
BOOL CMP(ノードA、ノードB)
{ 
    戻り、AR < BR。
} 

INT lowbit(INT X)
{ 
    戻り X&( - X)。
} 

ボイド更新(int型のx、int型K)
{ 
    一方(X <= N){ 
        C [X] + = K。
        X + = lowbit(X)。
    } 
} 

int型GetSum(INT X)
{ 
    int型 ANS = 0 ;
     一方、(X> 0 ){ 
        ANS + = C [X]; 
        X - = lowbit(X); 
    } 
    戻りANS; 
} 

int型(メイン)
{ 
    ためINT I = 1 ; IはMAXNを<; ++ I){
         ためINT J = 2 * I、J <MAXN; = J + I){ 
            NUM [J] .push_back(I); // 置く因子それらの各々のための数を再生テーブル、調和級数見かけの複雑性O(nlog N-)
        } 
    }
    以下のためにint型 I = 1 ; I <MAXN; ++ I){
         ためINT J = 2 * I、J <MAXN; J + = I){ 
            NUM [I] .push_back(J)。
        } 
    } 
    のscanf(" %d個の%のD "、&​​N、&M)。
    以下のためにint型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。
    以下のためにint型 I = 1 ; I <= M; iは++ ){
         int型のL、R。
        scanf関数(" %dの%のD "、&​​L&R)。
        EX [I] = ノード(L、R、I)。
    } 
    のmemset(VIS、 - 1はsizeof (VIS))。
    ソート(EX + 1、EX + 1 + M、CMP)。
    int型になりました= 1 ;
    以下のためにint型 i = 1 ; iが<= N; iは++ ){
         int型のx = [I]。
        int型 J = 0 ; J <NUM [X] .size(); J ++ ){
             int型、Y =NUM [X] [J]。
            もし(!VIS [Y] = - 1)アップデート(VIS [Y]、1 )。
        } 
        VIS [X] = I。
        一方、(今<= M && I == EX [今] .R){
             int型 RES = getsum(EX [今] .R) - getsum(EX [今] .L - 1 )。
            ANS [EX [今] .ID] =のRES。 ++ ; 
        } 
    } 
    のためのint型 I = 1のprintf(; I <= M I ++)は" %d個の\ n " 、ANS [I])。
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/EchoZQN/p/11521242.html
おすすめ