AcWing :. 241楼蘭トーテム(フェンウィックツリー順序は逆)

割り当てられたタスクを完了した後、西は、楼蘭の古代都市の314西に来ました。

伝説によると、昔、この土地に(それ以前楼蘭の古代都市よりは)2つの部族、部族の崇拝ナイフ(「V」)、部族の礼拝スペード(「∧」)を住んでいた、と彼らが表現するためにV字状とした∧それぞれの部族のトーテム。

以下Kroraina 314にウエスト巨大壁画を発見し、点Nと垂直位置の水平方向の位置を測定することにより求めた点Nを、標識された壁画は、ペアワイズ互いに素です。

N点の相対位置と壁画に含まれる情報は、したがって座標が提供される可能性があること西314 1 Y 1 2 Y 2 ... N- Y N - (1 、Y1)、(2、Y 2 )、...、(N、YN)、 前記Y 1 Y 1〜Y n個乃至Ynはnに1に配置されています。

314西は壁画がトーテムの番号が含まれて勉強するつもりです。

三点場合I Y I J Y J K Y K (I、イ)、(J、YJ)、(K、YK)を満たす。1 Iは< J < KをN Y I > Y J Y J < Y K 1≤i<J <K≤n及びYI> YJ、YJ <YK、Vは三点がトーテムを構成すると言われています。

三点場合I Y I J Y J K Y K (I、イ)、(J、YJ)、(K、YK)を満たす。1 Iは< J < KをN 及びY Iが< Y J Y J > Y Kを 1≤i<J <K≤n及びYI <YJ、YJ> YK、トーテムと呼ばれる3つのドット∧。

314西は2つの部族のトーテムにn個の点の数を知りたいです。

そのため、あなたは数および∧Vの数を見つけるためのプログラムを記述する必要があります。

入力形式

最初の行番号n。

2行目を表す数NであるYを1 Y 2 ... Y N- Y1、Y2、...、Ynの。

出力フォーマット

番号とV∧の数続く中間領域によって分離された2つの数字、。

データ範囲

すべてのデータについては、N- 200000 n≤200000、および出力が回答int64型を超えることはありません。

サンプル入力:

5
1 5 3 2 4

出力例:

3 4

 

溶液:1から〜Nアレイleftdownにレコードの現在の数よりも少ないアレイleftupのレコードの数の現在の値よりも大きい順序を逆に再度ダウン求めます。同様に、nは1〜再び要求数から逆の順序に対しては、アレイrightdownにレコードの現在の数よりも少ないアレイrightupに現在のレコードよりも大きいです。その後、再びアレイ、現在の中心点値、量「V」、すなわち、横断するのみ必要(leftup電流値よりも大きい数の前の数を[I] *現在の後部rightupより大きい値[I])。同様に「^」の数を求めています。

 

書式#include <iostreamの> 
の#include <cstdioを> 使用して名前空間はstdを、
typedefの長い長いLL。const int型 MAXN = 2E5 + 7 int型のn;
int型ARR [MAXN]、ツリー[MAXN]。
LL leftup [MAXN]、rightup [MAXN]、rightdown [MAXN]、[MAXN] leftdown。INT lowbit(INT X){
     戻り X&( - X)。
} 
(ASK llの整数X){ 
    LL RES = 0 一方、(X> = 1 ){ 
        RES + =

 
 

 




ツリー[X]。
        X - = lowbit(X)。
    } 
    戻りRESと、
} 

ボイド追加(INT X){
     一方(X <= N){ 
        ツリー[X] ++ ; 
        X + = lowbit(X)。
    } 
} 

int型のmain(){ 
    scanf関数(" %のD "、&N)
    以下のためにint型 i = 1 ; iが<= N; iが++ ){ 
        scanf関数(" %のD "、およびARR [I])。
    } 
    のためにint型 I = 1 ; I <= N。私は++ ){ 
        leftdown [I] =(ASK ARR [I] - 1 )。
        [I] leftup =(n)を尋ねる- (ARR [i])と尋ねます。
        追加(ARR [I])。
    } 
    のためにint型 i = 1 ; iがn = <; iは++ ){ 
        ツリーを[I] = 0 ; 
    } 
    のためにint型 I = N; I> = 1 ; i-- ){ 
        rightdownは、[I] =尋ねる([I] ARRを- 1 )。
        rightup [I] =(n)を尋ねる- 尋ねる(ARR [I])。
        追加(ARR [I])。
    }
    LL ANS1 = 0、ANS2 = 0 以下のためにint型 i = 1 ; iが<= N; iは++ ){ 
        ANS1 + = leftup [I] * rightup [I]。
        ANS2 + = leftdown [I] * rightdown [I]。
    } 
    COUT << ANS1 << "  " << ANS2 << ENDL。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/buhuiflydepig/p/11404025.html