Advertisement
mrlolthe1st

Untitled

Nov 16th, 2021
1,211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.17 KB | None | 0 0
  1. Const
  2.     MaxN = 20000;
  3. Type
  4.     TNumber = Record
  5.         Num, I : LongInt;
  6.     End;
  7. Var
  8.     A : Array [1 .. MaxN] Of TNumber;
  9.     X, N : LongInt;
  10. Function IsLess(Var A, B : TNumber) : Boolean;
  11. Begin
  12.     IsLess := A.Num <= B.Num;
  13.     If A.Num = B.Num Then IsLess := A.I <= B.I;
  14. End;
  15. Function LinearInverseBubbleSort(A : Array Of TNumber; N : LongInt) : LongInt;
  16. Var
  17.     Ans, I, J : LongInt;
  18.     T : TNumber;
  19. Begin
  20.     Ans := 0;
  21.     For I := 1 To N Do
  22.     Begin
  23.         For J := 0 To N - I - 1 Do
  24.         Begin
  25.             If Not IsLess(A[J], A[J + 1]) Then
  26.             Begin
  27.                 Inc(Ans);
  28.                 T := A[J + 1];
  29.                 A[J + 1] := A[J];
  30.                 A[J] := T;
  31.             End;
  32.         End;
  33.     End;
  34.     LinearInverseBubbleSort := Ans;
  35. End;
  36.  
  37. Procedure Merge(Var A, Res : Array Of TNumber; L, R, L1, R1 : LongInt);
  38. Var
  39.     I, LOrig : LongInt;
  40. Begin
  41.     I := -1;
  42.     LOrig := L;
  43.     While (L <= R) And (L1 <= R1) Do
  44.     Begin
  45.         If A[L].Num <= A[L1].Num Then
  46.         Begin
  47.             Inc(I);
  48.             Res[I] := A[L];
  49.             Inc(L);
  50.         End Else
  51.         Begin
  52.             Inc(I);
  53.             Res[I] := A[L1];
  54.             Inc(Res[I].I, R - L + 1);
  55.             Inc(L1);
  56.         End;
  57.     End;
  58.     While L <= R Do
  59.     Begin
  60.         Inc(I);
  61.         Res[I] := A[L];
  62.         Inc(L);
  63.     End;
  64.     While L1 <= R1 Do
  65.     Begin
  66.         Inc(I);
  67.         Res[I] := A[L1];
  68.         Inc(L1);
  69.     End;
  70. End;
  71.  
  72. Procedure MergeSort(Var A : Array Of TNumber; L, R : LongInt);
  73. Var
  74.     Res : Array[0 .. MaxN] Of TNumber;
  75.     I : LongInt;
  76. Begin
  77.     If (R - L <= 0) Then Exit;
  78.     MergeSort(A, L, (L + R) Shr 1);
  79.     MergeSort(A, 1 + ((L + R) Shr 1), R);
  80.     Merge(A, res, L, (L + R) Shr 1, 1 + ((L + R) Shr 1), R);
  81.     For I := L To R Do
  82.     Begin
  83.         A[I] := Res[I - L];
  84.     End;
  85. End;
  86.  
  87. Begin
  88.     N := MaxN;
  89.     For N := 1 To N Do
  90.     Begin
  91.         A[N].Num := Random(65535);
  92.         A[N].I := 0;
  93.     End;
  94.     //WriteLn(LinearInverseBubbleSort(A, N));
  95.     //Halt(0);
  96.     MergeSort(A, 0, N - 1);
  97.     X := 0;
  98.     For N := 1 To N Do
  99.     Begin
  100.         Inc(X, A[N].I);
  101.     End;
  102.     WriteLn(X);
  103. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement