Qatar çeşidləyicisi#8735

Qatar çeşidləyicisi (Həll təhlili)

Tutaq ki, massivinə giriş permutasiyası daxildir — vaqonların cari sırası. Axtarılan minimal permutasiya sayı bu permutasiyanın sərtliyinə bərabərdir.

İnversiya (m_i, m_j) cütlükdür, belə ki, i < j, amma bu zaman m_i > m_j. Başqa sözlə desək, elementlər cütlüyü inversiya əmələ gətirir, əgər onlar qeyri-düzgün qaydada yerləşiblər.

Məsələn, m = \{3, 1, 2\} massivində və cütlükləri inversiya əmələ gətirir. cütlüyü inversiya əmələ gətirmir, çünki 1 və 2 düzgün ardıcıllıqla yerləşiblər.

Uzunluğu olan massivdə inversiyaların sayını iki dövrə vasitəsilə hesablamaq mümkündür: 1 \le i < j \le n olan bütün mümkün cütlüklərini nəzərdən keçiririk və əgər m_i > m_j olarsa, inversiyalar sayğacını 1 artırırıq.

Nümunə

Permutasiyadakı inversiyaların sayılmasının nümunəsini nəzərdən keçirək. Hər bir rəqəmin altına onun sağ tərəfində yerləşən elementlərlə birlikdə yaradılan inversiyaların sayını yazaq. Qoy i < j və m[i] > m[j] olan indekslərin sayını göstərsin.

Ümumi inversiya sayı -ya bərabərdir.

Tapşırıq

Aşağıdakı nümunə üçün həlli modelləşdirin.

Alqoritmin reallaşdırılması

massivini elan edək.

int m[100010];

testlərini ardıcıl olaraq emal edirik.

scanf("%d", &tests);
while (tests--)
{

Vaqonların giriş sırasını massivinə oxuyuruq.

  scanf("%d", &n);
  for (i = 0; i < n; i++)
    scanf("%d", &m[i]);

Qatarı sıraya salmaq üçün tələb olunan minimal permutasiya sayını dəyişənində hesablayırıq.

  res = 0;
  for (i = 0; i < n - 1; i++)
  for (j = i + 1; j < n; j++)
    if (m[i] > m[j]) res++;

Cavabı çıxışa veririk.

  printf("Optimal train swapping takes %lld swaps.\n", res);
}