Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Const
- MaxN = 20000;
- Type
- TNumber = Record
- Num, I : LongInt;
- End;
- Var
- A : Array [1 .. MaxN] Of TNumber;
- X, N : LongInt;
- Function IsLess(Var A, B : TNumber) : Boolean;
- Begin
- IsLess := A.Num <= B.Num;
- If A.Num = B.Num Then IsLess := A.I <= B.I;
- End;
- Function LinearInverseBubbleSort(A : Array Of TNumber; N : LongInt) : LongInt;
- Var
- Ans, I, J : LongInt;
- T : TNumber;
- Begin
- Ans := 0;
- For I := 1 To N Do
- Begin
- For J := 0 To N - I - 1 Do
- Begin
- If Not IsLess(A[J], A[J + 1]) Then
- Begin
- Inc(Ans);
- T := A[J + 1];
- A[J + 1] := A[J];
- A[J] := T;
- End;
- End;
- End;
- LinearInverseBubbleSort := Ans;
- End;
- Procedure Merge(Var A, Res : Array Of TNumber; L, R, L1, R1 : LongInt);
- Var
- I, LOrig : LongInt;
- Begin
- I := -1;
- LOrig := L;
- While (L <= R) And (L1 <= R1) Do
- Begin
- If A[L].Num <= A[L1].Num Then
- Begin
- Inc(I);
- Res[I] := A[L];
- Inc(L);
- End Else
- Begin
- Inc(I);
- Res[I] := A[L1];
- Inc(Res[I].I, R - L + 1);
- Inc(L1);
- End;
- End;
- While L <= R Do
- Begin
- Inc(I);
- Res[I] := A[L];
- Inc(L);
- End;
- While L1 <= R1 Do
- Begin
- Inc(I);
- Res[I] := A[L1];
- Inc(L1);
- End;
- End;
- Procedure MergeSort(Var A : Array Of TNumber; L, R : LongInt);
- Var
- Res : Array[0 .. MaxN] Of TNumber;
- I : LongInt;
- Begin
- If (R - L <= 0) Then Exit;
- MergeSort(A, L, (L + R) Shr 1);
- MergeSort(A, 1 + ((L + R) Shr 1), R);
- Merge(A, res, L, (L + R) Shr 1, 1 + ((L + R) Shr 1), R);
- For I := L To R Do
- Begin
- A[I] := Res[I - L];
- End;
- End;
- Begin
- N := MaxN;
- For N := 1 To N Do
- Begin
- A[N].Num := Random(65535);
- A[N].I := 0;
- End;
- //WriteLn(LinearInverseBubbleSort(A, N));
- //Halt(0);
- MergeSort(A, 0, N - 1);
- X := 0;
- For N := 1 To N Do
- Begin
- Inc(X, A[N].I);
- End;
- WriteLn(X);
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement