最初のペアごとに、見られるように、中間の必要数と共謀操作の数が一致しません。
私は、各操作の貪欲、最低限必要な数を考えます。
しかし、実際には、我々は唯一、再び左から右にスイープし、あまりにも多くの問題を練習する必要はありません。
現在の数字はペアが「一致」としてマークされている一方で、一致数をカウントしないであろう、登場している場合、後者は答えに影響を与えていないだろう。
アレイは、ツリー、位置、第二の発生、累積回答の最初の出現に対応する+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)。 }