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 = 0、INT R = 0、INT 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 ; }