Pembahasan Soal Paste

Tanpa menganalisis soal ini secara hati-hati mungkin anda langsung berfikir perlunya suatu struktur data untuk menyimpan array untuk mencatat posisi baris-baris selama operasi-operasi itu dilakukan. Itu masih OK kalau N masih kecil. Kalau kebetulan dalam testcase digunakan N = 100000 maka anda akan menghadapi masalah memory untuk mengalokasi array sebesar itu.

Dengan membacanya dan menganalisisnya dengan lebih hati-hati maka anda akan menemukan kesederhanaan masalah ini.

Pertama, operasi cut-and-paste itu bersifat reversible. Artinya, dari hasil suatu operasi kita bisa cari asalnya sebelum operasi itu dilakukan. perhatikan contoh berikut ini (baris-baris ditulis ke kanan dengan pemisah tanda koma).

Misalnya sebelum operasi baris-baris berisi:
a, b, c, d, e, f, g, h, i, j
setelah operasi cut(4, 8),
maka akan dihasilkan baris-baris
a, b, c, i, j
dengan (d, e, f, g, h) di dalam 'buffer'. Setelah paste(2) dihasilkan baris-baris
a, b, d, e, f, g, h, c, i, j

Sekarang kita balikan (reversi) operasinya.

Operasi paste dilakukan setelah posisi ke 2. Jadi posisi-posisi 1 - 2 (yaitu a, b) setelah dan sebelum paste sama. Kemudian karena operasi cut dilakukan pada 5 baris maka sejak posisi ke 3 - 7 (yaitu d, e, f, g, h) adalah berasal dari hasil paste isi buffer. Dan, posisi ke 8 - 10 (yaitu c, i, j) mengalami pergeseran sebanyak 5 posisi ke kiri; jadi sebelum paste ada di posisi ke 3-5. Jadi sebelum paste adalah a, b, c, i, j. Sementara, d, e, f, g, ada di 'buffer'.

Operasi cut(4,8) tidak mempengaruhi posisi 1 - 3 karena dilakukan mulai baris ke 4. Berarti terjadi pergeseran baris ke 4 - 5 (yaitu i, j) sebanyak 5 posisi ke kanan. Di tengah dimasukan yang ada di buffer.

Secara umum jika ditanyakan berasal dari mana baris yang sekarang bernomor x sebelum operasi cut-and-paste (M, A, S). Berikut ini kita formulasikan perncarian harga z yaitu nomor baris dari baris x berasal. Maka, terdapat sejumlah kemungkinan kasus:

Reversi Paste mencari y dari x

Reversi Cut mencari z dari y atau y' (di buffer)

Jika dilakukan sejumlah operasi, maka untuk suatu harga x reversi operasi tsb dilakukan dari yang terakhir hingga yang pertama. Harga z dari operasi ke p menjadi x dari operasi ke p-1, secara berulang. Karena x hanya diminta untuk 10 baris pertama saja maka algoritma ini anda hanya melakukan reversi sebanyak 10 x jumlah operasi.

Nah, anda sekarang hanya perlu suatu array (berukuran 1000 x 3 integer) untuk menyimpan seluruh parameter operasi tsb dan sementara buffer' itu sebenarnya tidak ada! (Lho koq bisa??)