問題のPOJ2352溶液(フェンウィック木)
2019年12月29日
ガウスによって供給
1.トピックポータル:POJ2352
効果2.対象:
これは非常に古典的なテンプレートのタイトルツリー配列です。
N個の星が与えられると、各星の二次元座標を持ち、星の必要数が低い星の各々の左側に位置している、という効果を受けます。
3.アルゴリズムのアイデア:
この質問は暴力行為、レッツ・計算のことを考えた直後に与えられます。
タイトル、N <= 15000によると、暴力行為があり、二重ループを、必要とし、15,000の2 =2.25億、秒を超え、それが思考アルゴリズムより良く、より速く追求しなければなりませんでした。
私たちがお問い合わせの合計を要求すると、あなたはフェンウィックの木を使用して考える必要があります。
同時に、この質問は、私たちは木のアレイの使用のための条件を持っている条件の対象である:昇順にリストされているスターY座標、X座標昇順星のY座標に等しいです。
だから我々は、ループ入力に直接計算の並べ替えを避けることができます。
以下のために(INT iが= 1 ; I <= N; I ++ ) { scanf関数(" %D%D "、およびX&Y)。 レベル[和( ++ X)] ++ ; 追加(X、1 )。 }
前記レベルアレイは0-Nのそれぞれのクラス内の星の数をカウントするために使用されます。
そして、私たちは標準lowbit機能とsum関数ツリー配列を見てみましょう:
INT和(INT X) { int型 ANS = 0 。 一方、(X> 0 ) { ANS + = A [X]。 X - = lowbit(X)。 } 戻りANS。 }
INT lowbit(INT X) { 戻り X& - X。 }
だから我々は、次のコードでは、完全なAC与え、統計計算の遅れを促進していること:
書式#include <cstdioを> 使用して 名前空間はstdを、 const int型 MAXN = 32005 ; int型[MAXN]、レベル[MAXN]、N、X、Yと、 INT lowbit(INT X) { 戻り X& - X。 } ボイド追加(int型のx、int型V) { 一方(X <= MAXN) { [X] + = V。 X + = lowbit(X)。 } } int型の和(INT X) { int型 ANS = 0; 一方、(X> 0 ) { ANS + = A [X]。 X - = lowbit(X)。 } 戻りANS。 } int型のmain() { scanf関数(" %のD "、&N) 以下のために(INT iが= 1 ; I <= N; I ++ ) { scanf関数(" %D%D "、およびX&Y)。 レベル[和( ++ X)] ++ ; 追加(X、1 )。 } のために(INT iは= 0 ; I <= N- 1、I ++)のprintf(" %dの\ n " 、レベル[I])。 リターン 0 ; }