Автор: | Г. Гренкин | Ограничение времени: | 1 сек | |
Входной файл: | input.txt | Ограничение памяти: | 256 Мб | |
Выходной файл: | output.txt |
У Марфы Геннадьевны есть папка с файлами (не компьютерная, а обычная), в которую она складывает свои документы. Марфа Геннадьевна пронумеровала свои документы от 1 до N и уже привыкла к тому, что у неё в первом файле лежит первый документ, во втором файле — второй и т.д.
Однажды к Марфе Геннадьевне пришёл в гости внук и стал рассматривать её документы. Разумеется, после этого документы оказались не на своих местах.
Теперь Марфа Геннадьевна хочет переложить документы в правильном порядке так, чтобы минимизировать количество выкладываний и вкладываний документов. Также требуется, чтобы при перекладываниях каждый раз вне папки находилось не более двух документов (чтобы не потерять документы).
Напишите программу, принимающую на вход расположение документов после визита внука, и выводящую искомую последовательность выкладываний и вкладываний документов.
Входной файл содержит целое число N, за которым следуют N целых чисел ai, где число ai означает, что в i-м файле лежит документ с номером ai.
Выходной файл должен содержать целое число K — количество выкладываний и вкладываний документов.
Далее должны следовать K пар целых чисел. Пара − j i означает выкладывание документа с номером j, находящегося в i-м файле. Пара j i означает вкладывание документа с номером j в i-й файл. Если решений несколько, выведите любое из них.
1 ≤ N ≤ 105, 1 ≤ ai ≤ N. Все числа ai различны.
№ | Входной файл (input.txt ) |
Выходной файл (output.txt ) |
---|---|---|
1 |
|
|
2 |
|
|
3 |
|
|
Очевидно, что минимальное количество действий равно количеству документов, которые лежат не на своих местах, умноженному на 2.
Начнем с любого i, для которого ai ≠ i, и обойдем соответствующий цикл перестановки. Сначала вынем документ с номером k = ai, находящийся в i-м файле. Положим ai = 0.
Предположение индукции: документ с номером k вынут. Затем повторим следующие действия, пока ak ≠ 0. Вынем документ с номером ak, находящийся в k-м файле, и положим в k-й файл документ с номером k, который мы ранее вынули из другого файла. Далее положим k = ak.
Описанные действия нужно проделать для каждого цикла перестановки, то есть начиная со всех i, для которых ai ≠ i.
const MAX_N = 100000; var a: array[1..MAX_N] of integer; n, cnt, i, k, tmp: integer; begin assign(input, 'input.txt'); reset(input); assign(output, 'output.txt'); rewrite(output); read(n); for i := 1 to n do read(a[i]); cnt := 0; for i := 1 to n do begin if (a[i] <> i) then inc(cnt); end; writeln(2*cnt); for i := 1 to n do begin if (a[i] <> i) then begin k := a[i]; a[i] := 0; writeln(-k, ' ', i); while (a[k] <> 0) do begin writeln(-a[k], ' ', k); writeln(k, ' ', k); tmp := a[k]; a[k] := k; k := tmp; end; writeln(k, ' ', k); end; end; close(input); close(output); end.