元の質問へのリンク:美容値
質問の意味:あなたはのサブ区間のすべての異なる数の合計数を見つけるように、あなたの順序を与えるために
思考を:私のような一部の人々は、会長の統計間隔(別の種類の数をカウントする最初の時間を考える...まあ上私が行うとき)、それはそこに行きたくないだろう、と確かにパターンがあると言う方法を超える順位で多くの人々を見ることができます。
私はこのゾーン異なる回数の分析への貢献の範囲内の間隔の数を発見しました。例えばスウォッチ1213のために、我々は、区間[2,4]内の二番目こと及びその統計的寄与の数で考慮サブレンジ参照
オペレーターその左右両端から同じ番号の大きいセクションこと貢献度(1が他のセクションに影響を与えません)、そして私たちは、このポストはより大きな範囲を見つけるだろうと思い、もし例えば、[1,4]の貢献考慮しなければならない人。
実際に、我々は、生成された値の左端または右端の範囲に貢献としてカウントすることができます。我々は、(統計を繰り返さないように)最も左側の寄与を生成するためにプレスを固定
(iは、出現位置であり、nは長さ)[I + 1、n]の間隔の範囲に寄与する位置posの、すなわち、値。そして、区間の数を数えます。したがって、我々は値を計算1213の貢献を参照、つまり[2,4]第1の、[2,3]、[3,4]、[3,3]
だから我々は[POS、n]の間の右のエンドポイント間の[I + 1、POS]にブレークポイントのすぐ左を見つけます。* I)(n - で - だから、最終的に我々は:( POSを関係を得ることができるPOS + 1)//私は録音を開始するには、1からである添字は、左のエンドポイントが0に設定されている場合に
私はこのチキン料理はとても簡単な見積もりが... TAT詳細な説明が書いたそれを置く好き
コード:
#include <ビット/ STDC ++ H> の#defineは長い長いllの 使用 名前空間STDを、 const int型 MAXN = 1E5 + 5 。 【MAXN] ARR LL。 int型CUR [MAXN]。 ANS LL; INT のmain(){ int型のn; cinを >> N; 以下のために(int型 iは= 1 ; iがn = <; iは++ ){ CIN >> ARR [I]。 } のLL L。 ANS = 0 ; memset(CUR、0、はsizeof (CUR))。 以下のための(int型 i = 1 ; iが<= N; iは++ ){ ANS + =(LL)(I-CUR [ARR [I]])*(N-I + 1 )。 cur変換[ARR [I] = I。 } COUT << ANS << ENDL。 リターン 0 ; }