Moのチームアルゴリズム-Powerful配列

強力な配列
テストあたりの時間制限
5秒
テストごとのメモリ制限
256メガバイト
入力
標準入力
出力
標準出力

正の整数のアレイ  1は、  2、...、  Nが  与えられます。私たちは、その任意の部分配列を検討してみましょう  L、  L  + 1 ...、  R、  1≤  リットルの  ≤  Rの  ≤の  n個すべての正の整数のための  S  によって表す  K S  の出現数   サブアレイに。私たちは呼んで  積の和サブアレーのパワーを  K SK Ssの  すべての正の整数のため  アレイ内の異なる値の数が実際に有限であるように和がゼロ以外の加数のみ有限数を含んでいます。

あなたはのパワー計算する必要があります  トン  与えられたサブアレイを。

入力

最初の行は二つの整数含ま  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]サブアレイ(サブアレイの要素が着色されています)。

次いで、  K 1 = 3、  K 2 = 2、  K 3 = 1、電力はと等しくなるように、  3 2・1 + 2 2・2 + 1 2・3 = 20。

 各間隔が算出される問合せの配列を指定し、これについての質問の意味は、数を乗じた出現数の正方形のための式。

問題の意味をよく理解することが、主な問題は、あまりにもビッグデータの配列サイズで、問い合わせ件数は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 ; 
}

 

おすすめ

転載: www.cnblogs.com/wengsy150943/p/11209823.html