正の整数のアレイ 1は、 2、...、 Nが 与えられます。私たちは、その任意の部分配列を検討してみましょう L、 L + 1 ...、 R、 1≤ リットルの ≤ Rの ≤の n個。すべての正の整数のための S によって表す K S の出現数 の サブアレイに。私たちは呼んで 積の和サブアレーのパワーを K S・K S・sの すべての正の整数のため の。アレイ内の異なる値の数が実際に有限であるように和がゼロ以外の加数のみ有限数を含んでいます。
あなたはのパワー計算する必要があります トン 与えられたサブアレイを。
最初の行は二つの整数含ま N 及び T (1≤ N、 T 配列の長さと対応してクエリの数- ≤200000参照)。
2行目は含ま nは 正の整数 I (≤1 iは ≦10 配列の要素- 6)。
次 のT ラインは2つの正の整数を含む L、 R (1個の≤ L ≤の Rの ≤の N左のインデックスと対応する部分配列の右端- )それぞれ。
出力 Tの 行は、 私の力-出力番目の行は、単一の正の整数を含むべきである I番目のクエリサブアレイを。
、使用しないでください C ++で64ビット整数を読み取りまたは書き込みに%のLLDのspecificatorを。使用するのが好ましい (また、あなたが使用することができますストリームCOUT %I64dを)。
3 2
1 2 1
1 2
1 3
3
6
8 3
1 1 2 2 1 3 1 1
2 7
1 6
2 7
20
20
20
次の配列(第二のサンプルを参照)、その検討[2]、[7]サブアレイ(サブアレイの要素が着色されています)。
各間隔が算出される問合せの配列を指定し、これについての質問の意味は、数を乗じた出現数の正方形のための式。
問題の意味をよく理解することが、主な問題は、あまりにもビッグデータの配列サイズで、問い合わせ件数は2E5です。最初の反応は、その後プレフィックスとMLEであり、Iは、ブロックを試み、またはMLE。それはMoのアルゴリズムを見たチームの補充を学びました。
アルゴリズムの効果は、集中的な間隔のクエリのために、あなたは可能な限り既存のクエリの結果を使用することができ、いじりで間に合わされます。
コンテンツを参照すると、以下のコードを、https://blog.csdn.net/vaeloverforever/article/details/82314626
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 const int型 MAXN = 2E5 + 50 。 const int型 INF = 0xFFFFFFの。 int型nは、T。 INT [MAXN] ARR。 INT CNT [ 1000005 ]、ID [MAXN]。 【MAXN] ANS LL。 int型のL、R。 int型のユニット。 今LL; 構造体の範囲{ int型のL、R。 int型のaskorder。 友人のブール 演算子 <(constのA&レンジ、CONSTレンジ&B){ 戻りのAl /単位= BL /ユニットのAl /ユニット<BL /単位:!?のAr < BR; } } [MAXN] rangee、 無効(デルをINT X){//削除されませんセクション 今 - =((CNT [ARR [X]] << 1) - 1)* (LL)ARR [X]; CNT [ARR [X]] - ; } 無効に追加する(INT X){/ /プラスに間隔 今 + =((CNT [ARR [X]] << 1)| 1)* (LL)ARR [X]; CNT [ARR [X]] ++ ; } int型(主) { scanf関数(" %d個の%のD "、&N、&T)。 以下のために(int型 iは= 1 ; iは<N + 1 ; ++ I) のscanf(" %dの"、およびARR [I])。 単位 = SQRT(T * 2.0 / 3 ); //块大小 のための(int型 i = 0 ; iはTを<; ++ I){ scanf関数(" %d個の%のD "、&rangee [I] .L&rangee [ I] .R)。 rangee [i]は.askorder = I。 } ソート(rangee、rangee +T); //排序以尽可能复用先前结果 ため(int型 i = 0 ; iはTを<; ++ I){ 一方(L < rangee [I] .L) デル(L ++ )。 一方、(R> rangee [I] .R) デル(R - )。 一方、(L> rangee [I] .L) を追加( - L)。 一方、(R < rangee [I] .R) (追加 ++ R)を、 ANS [rangee [I] .askorder] = 今。 } のための(INT I =0 ;私はトンを<; ++ I) のprintf(" %LLDする\ n " 、ANS [I])。 リターン 0 ; }