Editorial for Triangle Sort
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Neka je inverzija u permutaciji svaki par indeka , za koji važi i . Primetimo da nam je krajni cilj da za svako važi . Neka je parnost permutacije broj inverzija u njoj po modulu . Primetimo da se primenom operacije ne menja parnost permutacije. Pretpostavimo da imamo bar tri indeksa za koja važi da . Neka je najmanji indeks za koji važi . Neka je indeks za koji važi i neka je proizvoljan indeks, različit od i za koji (takav indeks postoji, jer za bar tri indeksa važi ). Ukoliko je , primenimo operaciju dva puta, a ukoliko je , primenimo operaciju jednom. Posle toga će važiti , tj. broj indeksa za koje važi će se smanjiti za bar jedan. Ovu proceduru možemo ponavljati sve dok postoje bar tri takva indeksa. Ukoliko više nije moguće ponoviti ovu proceduru, važi ili da smo sortirali niz ili da postoje tačno dva takva indeksa. Primetimo da ukoliko postoje tačno dva takva indeksa, tada je početna permutacija neparna, u suprotnom je parna. Dakle, dovoljno je proveriti parnost broja inverzija početne permutacije. Ovo se može postići koristeći _bit_ u kojem dodajemo vrednosti elemenata redom i svaki put proveravamo koliko smo većih dodali pre trenutnog u složenosti . Takođe je moguće rešiti zadatak u složenosti , simuliranjem opisane procedure.
Comments
How do you show the the parity of inversions remains the same when we perform the operation?
First, we should observe that this operation is a composition of two swaps. We will show that when two elements are swapped, parity of permutation changes. Let the two elements, which are to be swapped, be and , . Notice that if two adjacent elements are swapped, parity changes (if , then the number of inversions increases by , otherwise it decreases by ). Now note that swapping and is equivalent to swapping: and , then and , ..., then and , then and , ..., then and (imagine that we first "bring" to position , and after that to position ). Now note that we have applied exactly swaps and thus, parity changes. Since we will swap two elements twice in each operation, parity remains the same.
That's a great explanation! Thank you very much.
https://www.codechef.com/MAY20A/problems/TRPLSRT
😄