昨日は狂気失うように見えたプレーはなかった、それはそのSB問題ああそうです。
私たちは、最初のxの数のための単一区間[L、R]、[L、R]を考慮し、我々は、それがちょうど発注後の桁数のように排出される前に移動する必要があります。
だから、全体のxに対して、xのx個より少ないだけ貢献、私たちはその数字よりも、すべての小さなを計算し、xの前の数字は、xを含むすべてのセグメントで排出しました。
これは、配列の配列を維持するために使用することができます。
#include <ビット/ STDC ++。H> の#defineは LL長い長 の#define LD長い二 の#define ULL符号なし長い長 の#define第Fiの に#define SE第二 の#define MK make_pair の#define PLL対<LL、LL> の#define PLI対<LL、整数> の#define PII対<整数、整数> の#define SZ(X)((INT)x.size()) の#define ALL(X)(X).begin()、(X).END( ) の#define FIOイオス:: sync_with_stdio(偽); cin.tie(0)。使用して名前空間はstdを、CONSTのINT N = 5E5 + 7 。 const int型 INF = 0x3f3f3f3f 。 constの LL INF = 0x3f3f3f3f3f3f3f3f 。 const int型 MOD = 1E9 + 7 。 constの ダブル EPS = 1E- 8 ; CONST ダブル PI = ACOS( - 1 )。 テンプレート < クラス T、クラス S>インラインボイド追加(T&、S b)は{A + B =。もし(A> = MOD)A - = MOD;} テンプレート < クラス T、クラス S>インラインボイドサブ(T&、S b)は、{ - = B。もし(< 0)、A + = MOD;} テンプレート < クラス T、クラス S>インラインブール chkmax(T&、S b)は{ 返す <bは?= B、真:偽;} テンプレート < クラス T、クラス S>インラインブール chkmin(T&、S b)は{ 返す > bは?A = B、真:偽;} 構造体ビット{ INT [N]。 ボイドは、(変更INT X、INT {V) のために(INTI = xと; 私はNを<; I + = I& - I)([I]を追加し、V) } int型の和(INT X){ LL ANS = 0 。 以下のために(int型 I = xを、I; iが- = I& - I)(ANS、[I])を加えます。 戻るANSを。 } INTクエリ(int型 L、INT R){ 場合(L> R)戻り 0 ; リターン(SUM(R) -和(L - 1)+ MOD)%MOD。 } }ビット[ 2 ]。 int型[N]、nは、ID [N]。 LL CNT [N]。 ブール CMP(int型のx、int型のY){ 戻り [X] < [Y]を。 } int型のmain(){ scanf関数(" %のD "、&N) 以下のために(int型 i = 1 ; iが<= N; iは++)(scanf関数を" %のD "、&[i])と、ID [I] = I。 ソート(ID + 1、ID + 1 + N、CMP)。 int型 ANS = 0 ; 以下のために(int型 i = 1 ; iが++; iが<= N ){ INT X = ID [i]は、 LL CNT = 0 。 追加(CNT、1LL *ビット[ 0 ] .query(1、X - 1)*(N - X + 1)%のMOD)。 追加(CNT、1LL *ビット[ 1 ] .query(X + 1、N)* X%MOD)。 追加(CNT、1LL * X *(N - X + 1)%のMOD)。 (ANS、CNT追加 * [X]%のMOD)。 ビット[ 0 ] .modify(X、X)。 ビット[ 1 ] .modify(X、N - X + 1 )。 } のprintf(" %d個の\ n " 、ANS)。 リターン 0 ; } / * * /
ます。https://www.cnblogs.com/CJLHY/p/10874005.htmlで再現