bzoj1106([POI2007]キューブウォーズTET)(フェンウィック木)

ポータル

最初のペアごとに、見られるように、中間の必要数と共謀操作の数が一致しません。

私は、各操作の貪欲、最低限必要な数を考えます。

しかし、実際には、我々は唯一、再び左から右にスイープし、あまりにも多くの問題を練習する必要はありません。

現在の数字はペアが「一致」としてマークされている一方で、一致数をカウントしないであろう、登場している場合、後者は答えに影響を与えていないだろう。

アレイは、ツリー、位置、第二の発生、累積回答の最初の出現に対応する+1のツリーアレイ重み値を維持するために使用することができるがツリーアレイ重み番号の前の同じ位置-1。

#include <ビット/ STDC ++ H>
 に#define LL長い長 
 の#define N 50003 
 使用して 名前空間STDを、
INTはREAD()
{ 
    int型のx = 0、F = 1チャー S = GETCHAR()。
    一方、(S < ' 0 ' || S> ' 9 '){ もし、(S == ' - ')、F = - 1 ; S = GETCHAR();}
     一方、(S> = ' 0 ' && S <= ' 9 "S- + ' 0 ' ; S = GETCHAR();}
     戻りのx *のF。
} 
INT N; 
INT [N * C 2 ]、[N * 2 ]、VIS [N]。
ボイド更新(int型のx、int型V)
{ 
    ながら(x <= 2 ×n個)// 注意二倍
    { 
        C [X] + = V。
        X + = X&( - X)。
    } 
} 
int型の照会(INT X)
{ 
    int型 ANS = 0 同時に(X)
    { 
        ANS + = C [X]。
        X - = X&( - X)。
    } 
    戻りANS。
} 
int型のmain()
{ 
    N = )(読み取ります。
    以下のためにint型 i = 1 ; iが= < 2 * N; ++ i)は、
      [I]。= READ();
    int型 ANS = 0 ; 
    以下のためにint型 i = 1 ; iが<= 2 * N; ++ I)
    { 
        場合(VIS [I]]!)VIS [I] = I、更新(I、1 )。
         
        { 
            ANS + =クエリ(I) - クエリ(VIS [I])。
            アップデート(VIS [I]] - 1 )。
        } 
    } 
    のprintf(" %d個の\ n " 、ANS)。
}
コードの表示

おすすめ

転載: www.cnblogs.com/yyys-/p/11528922.html