olimpiade sains nasional 2015 deskripsi soal

advertisement
Hak Cipta Dilindungi
Undang-undang
OLIMPIADE SAINS NASIONAL 2015
DESKRIPSI SOAL DAN KUNCI JAWABAN
INFORMATIKA/KOMPUTER
Soal Sesi 0:
0A – Tekotek
0B – Sengketa Tanah
0C – Menimbang
Halaman 2 dari 64
Tekotek
Time limit: 1000 ms
Memory limit: 32768 KB
Deskripsi
Tek kotek, kotek kotek
Anak ayam turun berkotek
Tek kotek, kotek kotek
Anak ayam turun berkotek
Anak ayam turunlah 4
Mati satu tinggallah 3
Anak ayam turunlah 3
Mati satu tinggallah 2
Anak ayam turunlah 2
Mati satu tinggallah 1
Anak ayam turunlah 1
Mati satu tinggallah induknya
Pak Dengklek sedang berjalan-jalan di Malioboro sambil menyanyikan lagu tersebut. Akan
tetapi lagu tersebut sudah selesai dianyanyikan sebelum Pak Dengklek menyelesaikan
perjalanannya. Sehingga, Pak Dengklek berencana menambah jumlah ayam pada lirik lagu
tersebut. Karena Pak Dengklek sedang sibuk memilih suvenir, Pak Dengklek meminta
bantuan anda untuk membuatkan lirik untuk Pak Dengklek.
Format Masukan
Baris pertama akan berisi label kasus uji. Label kasus uji adalah sebuah string yang dijelaskan
sebagai berikut:
 Panjang string tersebut adalah banyaknya subsoal ditambah satu.
 Karakter ke-0 (indeks dimulai dari 0) akan berisi '0' jika kasus uji tersebut merupakan
contoh kasus uji, atau berisi '.' (titik) jika bukan.
 Untuk setiap nilai i di antara 1 hingga banyaknya subsoal, berlaku:
o Jika kasus uji tersebut memenuhi batasan subsoal ke-i, maka karakter ke-i berisi i,
atau
o Jika kasus uji tersebut tidak memenuhi batasan subsoal ke-i, maka karakter ke-i
berisi karakter '.' (titik).
Sebagai contoh, apabila label sebuah kasus uji sebuah soal adalah 0..345, maka:
 Soal tersebut memiliki 5 buah subsoal,
 Kasus uji tersebut merupakan contoh kasus uji, dan
 Kasus uji tesebut memenuhi batasan subsoal ke-3, ke-4, dan ke-5.
Baris kedua berisi satu bilangan N yaitu jumlah ayam yang diinginkan Pak Dengklek.
Halaman 3 dari 64
Format Keluaran
2N baris lirik yang diinginkan Pak Dengklek.
Contoh Masukan
0..34
3
Contoh Keluaran
Anak ayam turunlah 3
Mati satu tinggallah 2
Anak ayam turunlah 2
Mati satu tinggallah 1
Anak ayam turunlah 1
Mati satu tinggallah induknya
Subsoal
Subsoal 1 (10 poin)
Hanya berisi kasus uji ini:
.1.34
5
Subsoal 2 (20 poin)
Hanya berisi kasus uji ini:
..234
10
Subsoal 3 (30 poin)

1 ≤ N ≤ 100
Subsoal 4 (40 poin)

1 ≤ N ≤ 1.000
Halaman 4 dari 64
Sengketa Tanah
Time limit: 1000 ms
Memory limit: 65536 KB
Deskripsi
Candi Sewu adalah candi yang terletak tepat di perbatasan daerah Jawa Tengah dan Daerah
Istimewa Yogyakarta. Mungkin kalian pernah mendengar legenda bahwa candi ini dibangun
dalam semalam. Bandung Bandawasa ingin meminang putri Roro Jonggrang, namun sang
putri memberikan satu persyaratan: membangun 1.000 candi dalam semalam. Singkatnya,
dia digagalkan oleh Roro Jonggrang ketika sudah mencapai 999 candi. Akibatnya dia marah,
dan mengutuk Roro Jonggrang untuk menjadi candi terakhir.
Begitulah kisah yang selama ini diceritakan turun-temurun. Namun, ada satu bagian yang
terlewat dari kisah itu. Ketika ingin memulai membangun candi, Bandung Bandawasa
membeli sepetak tanah berukuran persegi panjang, tempat akan dibangunnya candi
tersebut. Namun, Mpu Dengklek (leluhur pak Dengklek) marah karena menurutnya tanah
yang ingin dibeli Bandung Bandawasa beririsan dengan tanah miliknya. Tentu saja Bandung
Bandawasa harus menyelesaikan sengketa tanah ini secepatnya sebelum memulai
membangun candi.
Kedua tanah berbentuk persegi panjang, di mana sisi-sisinya sejajar dengan sumbu x dan y
pada koordinat kartesian. Kedua tanah didefinisikan dengan koordinat kiri bawah dan kanan
atas persegi panjang. Tanah Bandung Bandawasa memiliki koordinat kiri bawah (Xb1, Yb1)
dan koordinat kanan atas (Xb2, Yb2). Sementara itu, tanah Mpu Dengklek memiliki
koordinat kiri bawah (Xd1, Yd1) dan koordinat kanan atas (Xd2, Yd2).
Anda akan membantu mereka menyelesaikan sengketa, dengan menentukan apakah benar
bahwa kedua tanah beririsan. Maksud dari beririsan adalah terdapat area dengan luas lebih
besar dari nol yang masuk ke dalam wilayah kedua tanah.
Sebagai contoh, misalkan tanah Bandung Bandawasa mempunyai koordinat (2, 1) hingga
(7,4), dan tanah Mpu Dengklek mempunyai koordinat (5, 2) hingga (8, 6). Pada gambar
berikut, terlihat bahwa kedua tanah beririsan di koordinat (5, 2) hingga (7, 4). Tanah
Bandung Bandawasa adalah yang berwarna biru, dan tanah Mpu Dengklek adalah yang
berwarna hijau.
Halaman 5 dari 64
Format Masukan
Baris pertama akan berisi label kasus uji. Label kasus uji adalah sebuah string yang dijelaskan
sebagai berikut:
 Panjang string tersebut adalah banyaknya subsoal ditambah satu.
 Karakter ke-0 (indeks dimulai dari 0) akan berisi '0' jika kasus uji tersebut merupakan
contoh kasus uji, atau berisi '.' (titik) jika bukan.
 Untuk setiap nilai i di antara 1 hingga banyaknya subsoal, berlaku:
o Jika kasus uji tersebut memenuhi batasan subsoal ke-i, maka karakter ke-i berisi i,
atau
o Jika kasus uji tersebut tidak memenuhi batasan subsoal ke-i, maka karakter ke-i
berisi karakter '.' (titik).
Sebagai contoh, apabila label sebuah kasus uji sebuah soal adalah 0..345, maka:
 Soal tersebut memiliki 5 buah subsoal,
 Kasus uji tersebut merupakan contoh kasus uji, dan
 Kasus uji tesebut memenuhi batasan subsoal ke-3, ke-4, dan ke-5.
Baris berikutnya berisi 4 buah bilangan bulat Xb1, Yb1, Xb2, dan Yb2, yang mendeskripsikan
tanah Bandung Bandawasa.
Baris berikutnya berisi 4 buah bilangan bulat Xd1, Yd1, Xd2, dan Yd2, yang mendeskripsikan
tanah Mpu Dengklek.
Format Keluaran
Keluaran terdiri dari sebuah baris yang berisi sebuah string. Jika kedua tanah beririsan, maka
keluarkan SENGKETA. Jika tidak, keluarkan DAMAI.
Halaman 6 dari 64
Contoh Masukan 1
0...4
2 1 7 4
5 2 8 6
Contoh Keluaran 1
SENGKETA
Contoh Masukan 2
0...4
2 3 8 4
3 1 6 3
Contoh Keluaran 2
DAMAI
Penjelasan Contoh 2
Walaupun kedua tanah saling menempel, tapi tidak ada area yang masuk ke dalam wilayah
kedua tanah, sehingga tidak terjadi sengketa.
Subsoal
Untuk semua subsoal, berlaku:

Xb1 < Xb2
Halaman 7 dari 64




Yb1 < Yb2
Xd1 < Xd2
Yd1 < Yd2
Semua bilangan pada koordinat adalah bilangan bulat positif dan kurang dari 1.000.
Subsoal 1 (10 poin)
Hanya berisi kasus uji ini:
.1..4
0 0 100 120
50 80 75 100
Subsoal 2 (10 poin)
Hanya berisi kasus uji ini:
..234
1 2 3 4
1 6 8 9
Subsoal 3 (30 poin)

Xb1 = Xd1
Subsoal 4 (50 poin)

Tidak ada batasan tambahan.
Halaman 8 dari 64
Menimbang
Time limit: 1000 ms
Memory limit: 32768 KB
Deskripsi
Pak Dengklek baru saja kembali dari wisata ke Yogyakarta. Selama berada di Yogyakarta, Pak
Dengklek sering sekali belanja. Ia berhasil membeli banyak oleh-oleh untuk bebekbebeknya. Setelah puas, Pak Dengklek pulang ke rumah dengan menaiki bus AC. Ia
memutuskan untuk tidur selama perjalanan pulang karena terlalu lelah.
Ketika Pak Dengklek bangun dan bersiap untuk turun, Pak Dengklek menyadari sesuatu yang
aneh. Dia tidak bisa membedakan tasnya dengan tas milik penumpang lain! Ternyata, model
tas yang digunakan Pak Dengklek sangat populer. Dari luar, semua tas terlihat sama saja.
Satu-satunya yang Pak Dengklek tahu, tas miliknya adalah satu-satunya tas yang lebih berat
dari tas-tas lain. Semua tas lain beratnya sama.
Pak Dengklek akhirnya menaruh seluruh tas secara berjejer dan menomori tas-tas tersebut
dengan angka 1..N dari kiri ke kanan. Pak Dengklek memiliki kemampuan yang menarik: ia
bisa mengangkat sejumlah tas berbeda di masing-masing tangannya dan mengetahui
kumpulan tas yang mana yang lebih berat. Dengan melakukan hal ini, dia yakin bisa
menemukan tasnya. Namun, sebentar lagi bus akan berjalan lagi dan Pak Dengklek harus
cepat turun sehingga ia hanya bisa melakukan K kali penimbangan. Bantulah Pak Dengklek
memilih tas-tas mana yang harus ditimbang agar bisa menemukan tasnya secepat mungkin!
Format Interaksi
Baris pertama akan berisi label kasus uji. Label kasus uji adalah sebuah string yang dijelaskan
sebagai berikut:
 Panjang string tersebut adalah banyaknya subsoal ditambah satu.
 Karakter ke-0 (indeks dimulai dari 0) akan berisi '0' jika kasus uji tersebut merupakan
contoh kasus uji, atau berisi '.' (titik) jika bukan.
 Untuk setiap nilai i di antara 1 hingga banyaknya subsoal, berlaku:
o Jika kasus uji tersebut memenuhi batasan subsoal ke-i, maka karakter ke-i berisi i,
atau
o Jika kasus uji tersebut tidak memenuhi batasan subsoal ke-i, maka karakter ke-i
berisi karakter '.' (titik).
Sebagai contoh, apabila label sebuah kasus uji sebuah soal adalah 0..345, maka:
 Soal tersebut memiliki 5 buah subsoal,
 Kasus uji tersebut merupakan contoh kasus uji, dan
 Kasus uji tesebut memenuhi batasan subsoal ke-3, ke-4, dan ke-5.
Baris kedua berisi bilangan bulat N dan K, yang merupakan banyak tas yang berada di bus
dan banyak penimbangan maksimum yang bisa Pak Dengklek lakukan. Setelah itu, program
Anda dapat melakukan serangkaian tindakan, yang masing-masing merupakan salah satu
dari:
Halaman 9 dari 64

Memilih tas. Program Anda harus mengeluarkan sebuah baris berisi AMBIL Y yakni, kata
AMBIL diikuti dengan nomor tas pilihan Anda.
 Bertanya. Program Anda harus mengeluarkan sebuah baris berisi TIMBANG A T1 T2 .. TA
B T1 T2 .. TB yakni, kata TIMBANG diikuti dengan banyak tas yang ingin anda pegang di
tangan kiri dan nomor-nomor tas yang ingin anda pegang di tangan kanan.
Setiap kali program Anda selesai mengeluarkan pertanyaan, program Anda membaca
sebuah string, KIRI jika lebih berat tas-tas di kiri, KANAN jika lebih berat tas-tas di
kanan, SAMA jika berat kedua sisi sama.
Setelah anda memilih tas, program akan berhenti dan anda akan mendapat poin jika
tebakan anda benar.
Pastikan program Anda berhenti melakukan interaksi setelah menebak tas mana yang paling
berat.
Contoh Interaksi
Berikut adalah contoh interaksi program, dengan tas terberatnya adalah tas nomor 8.
Keluaran Program Anda
Keluaran Program Grader
01...
8 7
TIMBANG 1 1 1 2
SAMA
TIMBANG 2 1 2 1 4
KIRI
TIMBANG 2 1 8 1 2
KIRI
AMBIL 8
(interaksi selesai)
Halaman 10 dari 64
Subsoal
Pada semua subsoal, harus berlaku:


Jika program Anda memilih tas, maka 1 ≤ Y ≤ N
Jika program Anda bertanya, maka 1 ≤ A, B, nomor-nomor tas ≤ N
Subsoal 1 (10 poin)


N=8
K=7
Subsoal 2 (20 poin)


N = 16
K=8
Subsoal 3 (30 poin)


N = 32
K=6
Subsoal 4 (40 poin)


N = 81
K=4
Peringatan
Jika program Anda melakukan salah satu dari hal-hal di bawah ini:

melakukan tindakan di luar format dan batasan yang ditentukan,
bertanya lebih dari K kali, atau
 salah mengambil tas (bukan yang terberat)
maka nilai Anda untuk subsoal yang bersangkutan adalah nol.

Selain itu, pastikan pula bahwa program Anda harus berhenti jika selesai melakukan
interaksi. BIla tidak, maka Anda mungkin mendapatkan Time Limit Exceeded atau Runtime
Error untuk kasus uji yang bersangkutan.
Halaman 11 dari 64
Soal Sesi 1:
1A – Pertahanan Yogya
1B – Menyiram Sawah
1C – Bisa Jadi Tebak Angka
Halaman 12 dari 64
Pertahanan Yogya
Time limit: 1000 ms
Memory limit: 65536 KB
Deskripsi
Yogya dalam bahaya! Sesosok makhluk jahat ingin menguasai Yogya dengan kekuatan
kegelapan. Pak Dengklek tidak ingin tinggal diam walaupun ia sedang berlibur. Ia berusaha
untuk mengalahkan dan mengusir makhluk jahat tersebut dari Yogya. Tentu tugas ini tidaklah
mudah, karena selain makhluk jahat tersebut merupakan petarung yang kuat, ia juga memiliki
banyak anak buah.
Sebagai seorang petarung senior, Pak Dengklek tahu bahwa ia tidak boleh gegabah saat
melawan makhluk jahat tersebut. Berkat kemampuan analisisnya, ia punya informasi
keterampilan bertarung makhluk jahat dan seluruh anak buahnya. Untuk kemudahan,
makhluk-makhluk dinomori dari 1 sampai dengan N. Keterampilan bertarung makhluk ke-i
dinyatakan dalam dua pasang bilangan Si dan Ti, dengan Si adalah stamina dan Ti adalah
tenaga makhluk tersebut. Untuk memudahkan, makhluk ke-1 adalah sang makhluk jahat, dan
makhluk ke-i untuk i > 1 adalah prajurit-prajuritnya. Pak Dengklek juga memiliki keterampilan
bertarung sendiri yang dinyatakan oleh Sd dan Td.
Proses pertarungan digambarkan oleh alur berikut: Pak Dengklek menyerang lawan,
mengurangi stamina musuh sebanyak Td. Kemudian musuh balik menyerang pak Dengklek,
mengurangi stamina pak Dengklek sebanyak Ti. Proses tersebut berulang terus-menerus
hingga salah satu di antara mereka kehabisan stamina (stamina ≤ 0) dan dinyatakan kalah.
Pak Dengklek sadar, mungkin sang makhluk jahat terlalu kuat untuk dikalahkan, karena itu ia
bisa saja melawan prajurit-prajuritnya terlebih dahulu. Setiap kali Pak Dengklek mengalahkan
musuh, kemampuannya bertambah sebanyak Ls dan Lt. Artinya, stamina pak Dengklek
bertambah sebanyak Ls dan tenaganya bertambah Lt dari nilai yang sebelumnya. Sebagai
tambahan, setiap kali Pak Dengklek selesai dari suatu pertempuran, ia menyempatkan diri
beristirahat sehingga staminanya kembali pulih seperti semula.
Meskipun Pak Dengklek semakin kuat jika semakin banyak prajurit yang dikalahkan, ia juga
tak ingin berlama-lama. Bantulah Pak Dengklek mengatur urutan prajurit-prajurit yang perlu
dikalahkan sampai ia mampu mengalahkan sang makhluk jahat, sedemikian sehingga
banyaknya prajurit yang perlu dikalahkan adalah minimum.
Format Masukan
Baris pertama akan berisi label kasus uji. Label kasus uji adalah sebuah string yang dijelaskan
sebagai berikut:
 Panjang string tersebut adalah banyaknya subsoal ditambah satu.
 Karakter ke-0 (indeks dimulai dari 0) akan berisi 0 jika kasus uji tersebut merupakan
contoh kasus uji, atau berisi '.' (titik) jika bukan.
Halaman 13 dari 64

Untuk setiap nilai i di antara 1 hingga banyaknya subsoal, berlaku:
o jika kasus uji tersebut memenuhi batasan subsoal ke-i, maka karakter ke-i berisi i,
atau
o jika kasus uji tersebut tidak memenuhi batasan subsoal ke-i, maka karakter ke-i
berisi karakter '.' (titik).
Sebagai contoh apabila label sebuah kasus uji sebuah soal adalah 0..345, maka:
 Soal tersebut memiliki 5 buah subsoal,
 Kasus uji tersebut merupakan contoh kasus uji, dan
 Kasus uji tesebut memenuhi batasan subsoal ke-3, ke-4, dan ke-5.
Baris berikutnya terdiri dari 5 bilangan: Sd, Td, Ls, Lt, dan N.
N baris berikutnya terdiri dari dua buah bilangan Si dan Ti yang menyatakan keahlian
bertarung musuh ke-i. Musuh ke-1 merupakan makhluk jahat yang perlu dikalahkan oleh
Pak Dengklek.
Format Keluaran
Keluarkan sebuah bilangan Q yang menyatakan banyaknya prajurit minimum yang perlu
dikalahkan pak Dengklek sebelum siap melawan makhluk jahat. Q baris berikutnya adalah
indeks i (1 < i ≤ N) yang menyatakan urutan prajurit musuh yang dikalahkan. Apabila
terdapat lebih dari satu kemungkinan urutan, keluarkan yang mana saja.
Apabila Pak Dengklek tidak bisa membunuh makhluk jahat, keluarkan -1.
Contoh Masukan
0..34567
10 5 2 0 4
15 6
11 5
6 4
14 5
Contoh Keluaran
2
3
2
Halaman 14 dari 64
Subsoal
Pada setiap subsoal, berlaku


1 ≤ Sd, Td, Si, Ti ≤ 100.000
0 ≤ Ls, Lt ≤ 100.000
Subsoal 1 (5 poin)
Subsoal ini hanya berisi kasus uji berikut ini:
.1.34..7
5 2 1 1 4
6 4
2 10
20 1
5 5
Subsoal 2 (7 poin)
Subsoal ini hanya berisi kasus uji berikut ini:
..234..7
25 25 25 25 5
93 52
90 60
32 92
14 78
19 77
Subsoal 3 (10 poin)

1 ≤ N ≤ 10
Subsoal 4 (12 poin)

1 ≤ N ≤ 100
Subsoal 5 (15 poin)


1 ≤ N ≤ 1.000
Lt = 0
Subsoal 6 (20 poin)


1 ≤ N ≤ 100.000
Lt = 0
Halaman 15 dari 64
Subsoal 7 (31 poin)

1 ≤ N ≤ 100.000
Halaman 16 dari 64
Menyiram Sawah
Time limit: 1000 ms
Memory limit: 65536 KB
Deskripsi
Pak Dengklek memiliki sawah yang sangat luas. Uniknya, sawah Pak Dengklek berada di
pegunungan, sehingga ketinggian sawah Pak Dengklek bervariasi antar petaknya. Sawah Pak
Dengklek berukuran N x M petak. Petak sawah pojok atas kiri dinomori petak [1,1] dan pojok
kanan bawah dinomori [N,M]. Setiap petak sawah Pak Dengklek memiliki ketinggian T[i,j].
Agar padi-padi di sawah Pak Dengklek tumbuh dengan subur, ia harus menyiram sawahnya
setiap hari. Karena struktur ketinggian sawah Pak Dengklek yang sedemikian rupa, ketika Pak
Dengklek menyiram sawah pada suatu petak, air akan selalu mengalir ke petak dengan
ketinggian yang lebih kecil. Lebih jelasnya, ketika Pak Dengklek menyiram petak [i,j], air akan
mengalir ke seluruh petak yang bertetanggaan (4 arah) dengan [i,j] jika ketinggian petak
tetangganya lebih rendah dibandingkan ketinggian petak [i,j]. Tetangga dari suatu petak
adalah 4 petak lainnya yang berbagi sisi. Air ini akan terus mengalir, hingga ia berada di petak
dimana semua tetangganya memiliki ketinggian yang lebih tinggi atau sama.
Sebagai ilustrasi, perhatikan sawah Pak Dengklek berikut ini:
1
2
50 200
55
3
35
1
4
12 44
8
9
40
100 10
7
1
5
80
Angka-angka tersebut menunjukkan ketinggian dari petak yang bersangkutan. Jika Pak
Dengklek menyiram Petak [3,4], maka hasilnya adalah:
1
2
50 200
55
3
35
1
4
12 44
8
9 40
100 10 7
1
5 80
Petak berwarna biru adalah petak yang dibasahi baik disiram secara langsung maupun
karena aliran air melewati petak tersebut.
Halaman 17 dari 64
Karena Pak Dengklek menyukai tantangan, Ia memberi anda teka-teki. Anda diberikan subpersegi dari sawah Pak Dengklek yang ditandai dengan 2 petak ujung [a,b] dan [c,d]. Petak
[a,b] menandakan petak ujung kiri atas, sementara [c,d] menandakan petak ujung kanan
bawah. Anda harus menjawab pertanyaan, apakah mungkin seluruh petak yang berada di
sub-persegi [a,b] sampai [c,d] dapat dibasahi hanya dengan sekali siram di petak kiri atas
(sawah di petak [a,b]) atau kanan bawah (sawah di petak [c,d] ) sub-persegi tersebut? Air
TIDAK bisa mengalir keluar dari sub-persegi tersebut. Jika ada petak yang bisa terbasahi
namun berada di luar sub-persegi, petak tersebut tidak akan terbasahi. Sebagai contoh, jika
sawahnya seperti contoh sebelumnya dan sub-perseginya adalah [2,2]..[3,4] maka
kemungkinan sawah setelah terbasahi adalah:
1
2
50 200
55
3
35
1
4
12 44
8
9 40
100 10 7
1
5 80
jika yang dibasahi awalnya adalah petak [2,2], dan
1
2
50 200
55
3
35
1
4
12 44
8
9 40
100 10 7
1
5 80
jika yang dibasahi awalnya adalah petak [3,4]
Format Masukan

Baris pertama akan berisi label kasus uji. Label kasus uji adalah sebuah string yang
dijelaskan sebagai berikut:
o Panjang string tersebut adalah banyaknya subsoal ditambah satu.
o Karakter ke-0 (indeks dimulai dari 0) akan berisi 0 jika kasus uji tersebut merupakan
contoh kasus uji, atau berisi '.' (titik) jika bukan.
o Untuk setiap nilai i di antara 1 hingga banyaknya subsoal, berlaku:
 jika kasus uji tersebut memenuhi batasan subsoal ke-i, maka karakter ke-i berisi
i, atau
 jika kasus uji tersebut tidak memenuhi batasan subsoal ke-i, maka karakter ke-i
berisi karakter '.' (titik).
o Sebagai contoh apabila label sebuah kasus uji sebuah soal adalah 0..345, maka:
o Soal tersebut memiliki 5 buah subsoal,
o Kasus uji tersebut merupakan contoh kasus uji, dan
Halaman 18 dari 64
o



Kasus uji tesebut memenuhi batasan subsoal ke-3, ke-4, dan ke-5.
Baris kedua terdiri dari 3 bilangan N,M dan Q.
N baris berikutnya terdiri dari M bilangan yang mendeskripsikan nilai ketinggian petakpetak sawah Pak Dengklek.
Q baris berikutnya adalah teka-teki Pak Dengklek yang terdiri dari 4 bilangan a, b, c, dan
d.
Format Keluaran
Untuk setiap teka-teki, keluarkan ‘Kiri Atas’ jika seluruh petak pada sub-persegi bisa dibasahi
dengan menyiram petak [a,b]. Keluarkan ‘Kanan Bawah’ jika seluruh petak pada sub-persegi
bisa dibasahi dengan menyiram petak [c,d], atau ‘Tidak Mungkin’ jika kedua hal tersebut
tidak memungkinkan.
Contoh Masukan
0...4.6
3 3 4
1 2 3
4 5 4
1 2 1
1 1 2 2
2 2 3 3
1 1 2 3
1 2 3 3
Contoh Keluaran
Kanan Bawah
Kiri Atas
Tidak Mungkin
Tidak Mungkin
Subsoal
Untuk semua subsoal, berlaku:


0 ≤ tinggi masing-masing petak sawah ≤ 109
1 ≤ a, c ≤ N

1 ≤ b, d ≤ M
Halaman 19 dari 64

1 ≤ N, M ≤ 1000

b<d
Subsoal 1 (7 poin)
Subsoal ini hanya berisi kasus uji berikut ini:
.1..4.6
5 5 6
28 58 49 39 63
77 78 25 55 100
76 79 73 72 22
49 78 70 71 58
86 47 26 60 61
1 1 2 2
4 4 5 5
3 4 5 5
2 1 3 2
4 4 5 5
3 3 4 4
Subsoal 2 (9 poin)
Subsoal ini hanya berisi kasus uji berikut ini:
..23456
1 50 8
58 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 49 50 51
52 53 54 55 56 70 69 68 67 66 65 64 45 8 91 63 32 15 82 30 86 93 2 64 87
1 13 1 27
1 19 1 37
1 12 1 25
1 30 1 36
1 19 1 21
1 2 1 24
1 30 1 37
1 23 1 30
Subsoal 3 (10 poin)
Halaman 20 dari 64


N=1
1 ≤ Q ≤ 10
Subsoal 4 (10 poin)

1 ≤ Q ≤ 10
Subsoal 5 (19 poin)


N=1
1 ≤ Q ≤ 106
Subsoal 6 (45 poin)

1 ≤ Q ≤ 106
Peringatan
Untuk menangani masukan/keluaran yang banyak, hindari menggunakan cin/cout
Halaman 21 dari 64
Bisa Jadi Tebak Angka
Time limit: 100 ms
Memory limit: 32768 KB
Deskripsi
Bebek-bebek Pak Dengklek sedang berwisata di Yogyakarta. Sekarang, mereka sedang berada
di Keraton Ngayogyakarta Hadiningrat. Selain berfungsi sebagai tempat tinggal sultan, di sana
terdapat museum yang menyimpan berbagai koleksi milik kesultanan, mulai dari pemberian
raja-raja Eropa, replika pusaka keraton, hingga gamelan yang dapat didengarkan secara
langsung pada saat-saat tertentu. Tentu saja bebek-bebek Pak Dengklek sangat tertarik
dengan semua itu.
Semua bebek kecuali Kwak dan Kwek. Ketika bebek-bebek lainnya asyik mengeksplorasi
kompleks Keraton yang sangat luas itu, Kwak dan Kwek malah berdiam di bawah pohon
karena bosan. Akhirnya mereka memutuskan untuk memainkan sebuah permainan tebak
angka sambil menunggu yang lain.
Permainan tersebut berjalan sebagai berikut. Pada awalnya, Kwak memikirkan sebuah
bilangan bulat antara 1 sampai dengan N, inklusif (misalkan bilangan tersebut adalah X). Kwek
harus menebak nilai dari X. Untuk itu, Kwek dapat mengajukan serangkaian pertanyaan.
Pada setiap pertanyaan, Kwek memberikan Kwak sebuah himpunan bilangan bulat S.
Kemudian, Kwak harus memberikan salah satu dari ketiga kemungkinan jawaban berikut:



YA , jika X terdapat pada S.
BISAJADI , jika X tidak terdapat pada S, namun X+1 atau X-1 terdapat pada S.
TIDAK , jika kedua kondisi di atas tidak terpenuhi.
Pada akhirnya, Kwek harus menebak bilangan yang dipikirkan Kwak. Jika tebakan tersebut
sama dengan X, maka Kwek dinyatakan menang.
Tentu saja mereka tidak dapat bermain terlalu lama karena sebentar lagi rombongan bebek
Pak Dengklek akan melanjutkan wisata ke tempat menarik lainnya di Yogyakarta. Oleh karena
itu, mereka membatasi permainan ini: Kwek hanya dapat bertanya maksimum K kali sebelum
menebak bilangan yang dipikirkan Kwak. Bantulah Kwek memenangkan permainan ini!
Format Interaksi
Baris pertama akan berisi label kasus uji. Label kasus uji adalah sebuah string yang dijelaskan
sebagai berikut:
 Panjang string tersebut adalah banyaknya subsoal ditambah satu.
 Karakter ke-0 (indeks dimulai dari 0) akan berisi 0 jika kasus uji tersebut merupakan
contoh kasus uji, atau berisi '.' (titik) jika bukan.
 Untuk setiap nilai i di antara 1 hingga banyaknya subsoal, berlaku:
o jika kasus uji tersebut memenuhi batasan subsoal ke-i, maka karakter ke-i berisi i,
atau
Halaman 22 dari 64
o
jika kasus uji tersebut tidak memenuhi batasan subsoal ke-i, maka karakter ke-i
berisi karakter '.' (titik).
Sebagai contoh apabila label sebuah kasus uji sebuah soal adalah 0..345, maka:
 Soal tersebut memiliki 5 buah subsoal,
 Kasus uji tersebut merupakan contoh kasus uji, dan
 Kasus uji tesebut memenuhi batasan subsoal ke-3, ke-4, dan ke-5.
Kemudian program Anda akan menerima dua buah bilangan bulat N dan K.
Setelah itu, program Anda dapat melakukan serangkaian tindakan, yang masing-masing
merupakan salah satu dari:


Menebak. Program Anda harus mengeluarkan sebuah baris berisi 0 Y yakni, bilangan 0
diikuti dengan tebakan Anda.
Bertanya. Program Anda harus mengeluarkan sebuah baris berisi M S1 S2 ... SM
yakni, sebuah bilangan bulat M diikuti dengan M buah bilangan bulat yang menyatakan
himpunan yang Anda tanyakan.
Setiap kali program Anda selesai mengeluarkan tebakan, program Anda membaca sebuah
string yang dijamin merupakan salah satu dari YA, BISAJADI, dan TIDAK, sesuai dengan
definisi pada deskripsi soal.
Pastikan program Anda berhenti melakukan interaksi setelah menebak bilangan yang
dipikirkan Kwak.
Contoh Interaksi
Berikut adalah contoh interaksi program, dengan bilangan yang dipikirkan Kwak adalah 8.
Keluaran Program Anda
Keluaran Program Grader
0......
10 3
4 0 3 4 5
TIDAK
3 6 7 8
YA
Halaman 23 dari 64
Keluaran Program Anda
Keluaran Program Grader
1 7
BISAJADI
0 8
(interaksi selesai)
Subsoal
Pada semua subsoal, harus berlaku:


Jika program Anda bertanya, maka 1 ≤ Y ≤ N
Jika program Anda menebak, maka 1 ≤ M ≤ 10.000 dan 0 ≤ Si ≤ 9.999
Subsoal 1 (6 poin)


N=8
K=3
Subsoal 2 (8 poin)

N = 64
 K=6
Khusus untuk subsoal 1 dan subsoal 2:




Hanya terdapat sebuah kasus uji (satu subsoal dinyatakan oleh satu kasus uji), yang
berupa game dan dapat dilihat di halaman pengumuman kontes.
Anda boleh memainkan permainan ini berulang kali tanpa mendapatkan penalti.
Jika Anda sudah memenangkan permainan untuk subsoal tertentu, Anda dapat memilih
pilihan pada permainan untuk mengeluarkan source code yang dapat langsung Anda
kirimkan ke grader dan menjawab dengan benar pada subsoal yang telah Anda
menangkan.
Anda tidak diwajibkan memainkan permainan ini untuk mengerjakan kedua subsoal ini.
Anda diperbolehkan untuk menulis kode Anda sendiri untuk mengerjakan kedua subsoal
ini.
Subsoal 3 (9 poin)


N=9
K=3
Subsoal 4 (12 poin)

N=9
Halaman 24 dari 64

K=2
Subsoal 5 (23 poin)


N = 25
K=3
Subsoal 6 (12 poin)


N = 6.500
K = 15
Subsoal 7 (30 poin)


N = 6.500
K=8
Catatan
Yang perlu diperhatikan adalah bahwa untuk tipe soal interaktif seperti ini, Anda harus
selalu memberikan perintah fflush(stdout); (bagi pengguna C/C++) atau flush(output); (bagi
pengguna PASCAL) setiap kali Anda mencetak keluaran (dengan kata lain, setiap kali ada
perintah mencetak keluaran misalnya write,writeln, printf, cout, atau puts, tepat di
bawahnya harus ada perintah fflush/flush).
Sebagai contoh, berikut adalah contoh source code dalam bahasa Pascal yang akan selalu
bertanya 1 1 dan kemudian menebak angka 1 tanpa mempedulikan nilai N dan K yang
diberikan maupun bacaan hasil interaksi.
var subsoal, jawaban: string;
N, K: longint;
begin
readln(subsoal);
readln(N, K);
writeln('1 1');
flush(output);
readln(jawaban);
writeln('0 1');
flush(output);
end.
Halaman 25 dari 64
Dan berikut adalah contoh source code yang melakukan hal yang sama dalam bahasa C++.
#include <cstdio>
#include <cstring>
char subsoal[100], jawaban[100];
int N, K;
int main() {
gets(subsoal);
scanf("%d %d", &N, &K);
printf("1 1\n");
fflush(stdout);
gets(jawaban);
printf("0 1\n");
fflush(stdout);
return 0;
}
Halaman 26 dari 64
Peringatan
Jika program Anda melakukan salah satu dari hal-hal di bawah ini:

melakukan tindakan di luar format dan batasan yang ditentukan,
bertanya lebih dari K kali, atau
 salah menjawab bilangan yang dipikirkan oleh Kwak
maka nilai Anda untuk subsoal yang bersangkutan adalah nol.

Selain itu, pastikan pula bahwa program Anda harus berhenti jika selesai melakukan
interaksi. BIla tidak, maka Anda mungkin mendapatkan Time Limit Exceeded, Runtime Error,
atau Internal Error untuk kasus uji yang bersangkutan.
Halaman 27 dari 64
Soal Sesi 2:
2A – Belanja di Malioboro
2B – Motif Batik
2C – Ayam Aneh
Halaman 28 dari 64
Belanja di Malioboro
Time limit: 1000 ms
Memory limit: 65536 KB
Deskripsi
Bebek-bebek Pak Dengklek sangat senang karena Pak Blangkon mengajak mereka untuk pergi
berbelanja di Malioboro, suatu tempat berbelanja yang terkenal di Yogyakarta.
Untuk soal ini, Malioboro bisa dianggap sebagai pertokoan melingkar yang terdiri dari M toko
yang diberi nomor dari 1 sampai dengan M. Jika ditelusuri secara searah jarum jam mulai dari
toko nomor 1, toko di sebelahnya adalah toko nomor 2, disusul dengan toko nomor 3, dan
seterusnya hingga toko nomor M, lalu kembali ke toko nomor 1.
Terdapat N ekor bebek yang pergi ke Malioboro. Bebek ke-i pada awalnya berada di toko
nomor Pi. Kondisi awal ini bisa dianggap terjadi pada menit ke-0. Bebek-bebek sangat
bersemangat dalam berbelanja, dan diketahui mereka bergerak dengan kelajuan konstan,
yaitu 1 toko per menit. Diketahui bahwa setiap bebek bergerak searah jarum jam atau
berlawanan arah jarum jam, dan tidak pernah berganti arah pergerakan.
Pak Blangkon sewaktu-waktu ingin mengetahui jarak terdekat antar bebek. Ia akan bertanya
sebanyak K kali dengan pertanyaan berbunyi “Pada menit ke-t, berapa jarak terdekat antara
bebek-bebek yang ada?” Jarak antara dua bebek didefinisikan sebagai banyaknya toko
minimal yang perlu dilewati oleh salah satu bebek untuk pergi ke toko tempat bebek lainnya
berada.
Bantulah Pak Blangkon menjawab pertanyaannya dengan efisien!
Format Masukan
Baris pertama akan berisi label kasus uji. Label kasus uji adalah sebuah string yang dijelaskan
sebagai berikut:
 Panjang string tersebut adalah banyaknya subsoal ditambah satu.
 Karakter ke-0 (indeks dimulai dari 0) akan berisi 0 jika kasus uji tersebut merupakan
contoh kasus uji, atau berisi '.' (titik) jika bukan.
 Untuk setiap nilai i di antara 1 hingga banyaknya subsoal, berlaku:
o jika kasus uji tersebut memenuhi batasan subsoal ke-i, maka karakter ke-i berisi i,
atau
o jika kasus uji tersebut tidak memenuhi batasan subsoal ke-i, maka karakter ke-i
berisi karakter '.' (titik).
Sebagai contoh apabila label sebuah kasus uji sebuah soal adalah 0..345, maka:
 Soal tersebut memiliki 5 buah subsoal,
 Kasus uji tersebut merupakan contoh kasus uji, dan
 Kasus uji tesebut memenuhi batasan subsoal ke-3, ke-4, dan ke-5.
Baris berikutnya berisi tiga bilangan bulat, yaitu M, N, dan K.
Halaman 29 dari 64
N baris berikutnya berisi informasi untuk setiap bebek. Baris ke-i ini berisi dua bilangan, yaitu
Pi, Ui. Jika Ui bernilai -1, artinya bebek ke-i bergerak berlawanan arah jarum jam. Jika
Ui bernilai 1, artinya bebek ke-i bergerak searah jarum jam.
K baris berikutnya berisi sebuah bilangan bulat, yaitu t yang menyatakan menit ke berapa
pada pertanyaan Pak Blangkon. Tidak dijamin bilangan pada baris-baris ini terurut.
Format Keluaran
Untuk setiap pertanyaan, cetak jarak minimal antara bebek-bebek yang ada pada menit
yang ditanyakan.
Contoh Masukan
0..34567
7 3 4
2 -1
3 1
5 -1
1
2
4
6
Contoh Keluaran
0
2
1
1
Halaman 30 dari 64
Penjelasan Contoh
Berikut ini adalah posisi bebek-bebek dari menit 0 sampai menit 6:
t Bebek 1 Bebek 2 Bebek 3
0
2
3
5
1
1
4
4
2
7
5
3
3
6
6
2
4
5
7
1
5
4
1
7
6
3
2
6
Untuk jawaban pertanyaannya:




Pada menit ke-1, jarak terdekat adalah 0 (bebek 2 dengan bebek 3).
Pada menit ke-2, jarak terdekat adalah 2 (bebek 1 dengan bebek 2, atau bebek 2 dengan
bebek 3).
Pada menit ke-4, jarak terdekat adalah 1 (bebek 2 dengan bebek 3).
Pada menit ke-6, jarak terdekat adalah 1 (bebek 1 dengan bebek 2).
Subsoal
Untuk setiap subsoal berlaku

Ui = -1, atau Ui = 1
Subsoal 1 (5 poin)
Subsoal ini hanya berisi kasus uji berikut ini:
.1.34567
30 4 10
5 -1
29 -1
12 1
16 1
6
13
17
7
Halaman 31 dari 64
20
1
15
16
2
19
Subsoal 2 (8 poin)
Subsoal ini hanya berisi kasus uji berikut ini:
..234567
70 7 8
37 1
33 1
59 1
67 -1
10 -1
39 -1
48 -1
5
3
4
12
14
6
11
9
Subsoal 3 (18 poin)




2 ≤ N ≤ 50
1 ≤ t ≤ 1.000
1 ≤ M ≤ 1.000
1 ≤ K ≤ 1.000
Subsoal 4 (27 poin)
Halaman 32 dari 64




2 ≤ N ≤ 1.000
1 ≤ t ≤ 1.000
1 ≤ M ≤ 1.000
1 ≤ K ≤ 1.000
Subsoal 5 (14 poin)




2 ≤ N ≤ 1.000
1 ≤ t ≤ 250.000
1 ≤ M ≤ 1.000
1 ≤ K ≤ 250.000
Subsoal 6 (19 poin)




2 ≤ N ≤ 1.000
1 ≤ t ≤ 250.000
1 ≤ M ≤ 250.000
1 ≤ K ≤ 250.000
Subsoal 7 (9 poin)




2 ≤ N ≤ 1.000
1 ≤ t ≤ 1.000.000.000 (109)
1 ≤ M ≤ 250.000
1 ≤ K ≤ 250.000
Halaman 33 dari 64
Motif Batik
Time limit: 1000 ms
Memory limit: 65536 KB
Deskripsi
Yogyakarta memiliki beberapa jenis motif batik. Masing-masing jenis motif memiliki makna
dan filosofinya tersendiri.
Pak Dengklek yang sedang berada di Yogyakarta mampir ke sejumlah butik dan membeli N
baju batik. Dari batik-batik yang dibeli Pak Dengklek, terdapat M jenis motif batik yang
dinomori dari 1 sampai dengan M. Batik ke-i yang dibeli Pak Dengklek memiliki motif jenis Ci,
dan memiliki tingkat kecerahan warna berupa suatu bilangan positif Wi.
Batik-batik yang dibeli ini akan dipakai oleh keluarga besar Dengklek, dan diabadikan dalam
sebuah foto keluarga. Pak Dengklek menyadari bahwa keindahan batik terletak pada
keanekaragamannya. Dari N batik yang telah dibeli, Pak Dengklek ingin mengukur “total
keindahan” dari seluruh batiknya. Menurut Pak Blangkon, sang ahli batik, total keindahan dari
suatu kumpulan batik adalah jumlahan dari selisih tingkat kecerahan warna untuk setiap
pasang batik yang berbeda motif.
Sebagai contoh, jika N = 5, C = [1, 2, 1, 2, 2], dan W = [5, 3, 2, 4, 6],
maka total keindahannya adalah :
|W1-W2| + |W1-W4| + |W1-W5| + |W2-W3| + |W3-W4| + |W3-W5|
= |5-3| + |5-4| + |5-6| + |3-2| + |2-4| + |2-6|
= 2 + 1 + 1 + 1 + 2 + 4
= 11.
Anda diberikan jenis motif dan tingkat kecerahan warna setiap batik yang dibeli Pak
Dengklek. Bantulah Pak Dengklek menentukan total keindahan dari batik-batik tersebut
Format Masukan
Baris pertama akan berisi label kasus uji. Label kasus uji adalah sebuah string yang dijelaskan
sebagai berikut:
 Panjang string tersebut adalah banyaknya subsoal ditambah satu.
 Karakter ke-0 (indeks dimulai dari 0) akan berisi 0 jika kasus uji tersebut merupakan
contoh kasus uji, atau berisi '.' (titik) jika bukan.
 Untuk setiap nilai i di antara 1 hingga banyaknya subsoal, berlaku:
o jika kasus uji tersebut memenuhi batasan subsoal ke-i, maka karakter ke-i berisi i,
atau
o jika kasus uji tersebut tidak memenuhi batasan subsoal ke-i, maka karakter ke-i
berisi karakter '.' (titik).
Sebagai contoh apabila label sebuah kasus uji sebuah soal adalah 0..345, maka:
 Soal tersebut memiliki 5 buah subsoal,
Halaman 34 dari 64

Kasus uji tersebut merupakan contoh kasus uji, dan
 Kasus uji tesebut memenuhi batasan subsoal ke-3, ke-4, dan ke-5.
Baris kedua berisi dua bilangan bulat, yaitu N dan M.
N baris berikutnya berisi dua bilangan bulat. Bilangan-bilangan di baris ke-i ini adalah Ci dan
Wi.
Format Keluaran
Sebuah bilangan yang menyatakan total keindahan dari kumpulan batik yang diberikan.
Contoh Masukan
0..3456.8
5 2
1 5
2 3
1 2
2 4
2 6
Contoh Keluaran
11
Subsoal
Pada setiap subsoal, berlaku


1 ≤ Ci ≤ M
1≤M≤N
Subsoal 1 (6 poin)
Hanya berisi kasus uji ini:
.1.3456.8
10 10
10 6
9 10
4 10
2 5
2 7
Halaman 35 dari 64
1 10
3 8
9 4
6 7
6 2
Subsoal 2 (8 poin)
Hanya berisi kasus uji ini:
..23456.8
11 3
3 7
3 9
3 10
1 9
1 6
1 10
1 9
2 8
1 1
3 7
2 9
Subsoal 3 (34 poin)



1 ≤ N ≤ 1.000
1 ≤ M ≤ 50
1 ≤ Wi ≤ 200
Subsoal 4 (6 poin)



1 ≤ N ≤ 105
1 ≤ M ≤ 50
1 ≤ Wi ≤ 200
Subsoal 5 (7 poin)



1 ≤ N ≤ 105
1 ≤ M ≤ 200
1 ≤ Wi ≤ 200
Halaman 36 dari 64
Subsoal 6 (9 poin)



1 ≤ N ≤ 105
1 ≤ M ≤ 2.000
1 ≤ Wi ≤ 2.000
Subsoal 7 (13 poin)




1 ≤ N ≤ 105
M=N
Ci = i
1 ≤ Wi ≤ 109
Subsoal 8 (17 poin)


1 ≤ N ≤ 105
1 ≤ Wi ≤ 109
Peringatan
Bagi pengguna C/C++, gunakan "%lld" atau cin/cout untuk membaca/menulis bilangan bulat
64-bit.
Halaman 37 dari 64
Ayam Aneh
Time limit: 100 ms
Memory limit: 32768 KB
Deskripsi
Untuk menghemat biaya perjalanan, Pak Dengklek dan bebek-bebeknya menginap di rumah
Pak Blangkon. Di sana, Pak Dengklek melihat kebun Pak Blangkon yang penuh dengan ayam.
Warna ayam Pak Blangkon bermacam-macam. Setiap hari, Pak Blangkon memberikan
ayamnya makanan. Makanan ini dapat mengakibatkan DNA seekor ayam bermutasi dan
alhasil menjadikan warna ayam tersebut berubah.
Pak Dengklek yang tertarik melihat warna ayam-ayam itu ingin mencoba mengubah warna
bebek-bebeknya sendiri. Pak Dengklek pun bertanya kepada Pak Blangkon tentang DNA
ayam-ayam yang dimiliki Pak Blangkon agar Pak Dengklek bisa mengimplementasikannya ke
bebeknya sendiri. Tetapi Pak Blangkon yang iseng menyuruh Pak Dengklek menebak sendiri
apa DNA ayamnya tersebut.
DNA ayam-ayam tersebut dapat direpresentasikan sebagai sebuah string yang terdiri atas N
huruf kapital dari A sampai dengan Z. Semua huruf yang sama dalam sebuah string DNA pasti
akan berada bersebelahan. Sebagai contoh, AAASSSDDDFF adalah sebuah string DNA,
sedangkan AAASSSDDDAAFFF bukan karena di antara A terdapat kelompok huruf S dan D.
Cara Pak Dengklek menebak adalah sebagai berikut: Pak Blangkon memberikan suatu
bilangan N yang merupakan panjang string DNA dari ayam yang ingin Pak Dengklek ketahui
DNA-nya. Selain itu, Pak Blangkon juga memberikan bilangan K yang merupakan batas
pertanyaan yang boleh Pak Dengklek tanyakan sebelum Pak Dengklek harus menebak string
DNA yang dimiliki ayam tersebut.
Setiap kali Pak Dengklek bertanya, ia akan memberikan suatu string. Setelah itu Pak Blangkon
akan membalas YA atau TIDAK berdasarkan apakah string yang ditanyakan Pak Dengklek
merupakan substring dari DNA ayam yang sedang ingin Pak Dengklek ketahui (YA jika
substring dan TIDAK jika bukan). Sebagai informasi, X merupakan substring dari Y apabila X
terdiri atas setidaknya satu karakter, dan X dapat dihasilkan dengan membuang nol atau lebih
huruf-huruf awalan Y dan nol atau lebih huruf-huruf akhiran Y. Sebagai contoh, BEBE, EBE,
BEK, dan BEBEK adalah substring dari BEBEK, sedangkan BEEK bukan substring dari BEBEK.
Pak Dengklek pun kebingungan dengan cara untuk menebak DNA ayam-ayam Pak Blangkon.
Bantulah Pak Dengklek menentukan DNA ayam Pak Blangkon!
Format Interaksi
Pada mulanya, program Anda akan menerima sebuah baris berisi label kasus uji. Label kasus
uji adalah sebuahstring yang dijelaskan sebagai berikut:
 Panjang string tersebut adalah banyaknya subsoal ditambah satu.
 Karakter ke-0 (indeks dimulai dari 0) akan berisi 0 jika kasus uji tersebut merupakan
contoh kasus uji, atau berisi '.' (titik) jika bukan.
Halaman 38 dari 64

Untuk setiap nilai i di antara 1 hingga banyaknya subsoal, berlaku:
o jika kasus uji tersebut memenuhi batasan subsoal ke-i, maka karakter ke-i berisi i,
atau
o jika kasus uji tersebut tidak memenuhi batasan subsoal ke-i, maka karakter ke-i
berisi karakter '.' (titik).
Sebagai contoh apabila label sebuah kasus uji sebuah soal adalah 0..345, maka:
 Soal tersebut memiliki 5 buah subsoal,
 Kasus uji tersebut merupakan contoh kasus uji, dan
 Kasus uji tesebut memenuhi batasan subsoal ke-3, ke-4, dan ke-5.
Kemudian, program Anda akan menerima sebuah baris berisi dua buah bilangan bulat N dan
K. Setelah itu, program Anda dapat melakukan serangkaian tindakan, yang masing-masing
merupakan salah satu dari:


Bertanya. Program Anda harus mengeluarkan sebuah baris berisi TANYA
<pertanyaan> yakni, string TANYAdiikuti dengan substring yang Anda tanyakan. Setiap
kali program Anda selesai bertanya, program Anda membaca sebuah string yang dijamin
merupakan salah satu dari YA atau TIDAK, sesuai dengan definisi pada deskripsi soal.
Menebak. Program Anda harus mengeluarkan sebuah baris berisi JAWAB
<jawaban> yakni, string JAWAB diikuti dengan string DNA tebakan Anda. Program
Anda harus berhenti setelah melakukan ini.
Contoh Interaksi
Misalkan string DNA yang sebenarnya adalah BAASSDDFFF. Berikut adalah contoh interaksi
yang mungkin terjadi.
Keluaran Program Anda
Keluaran Program Grader
0.....
10 3
TANYA ABCD
TIDAK
TANYA AASSDDFF
YA
TANYA DFFF
Halaman 39 dari 64
Keluaran Program Anda
Keluaran Program Grader
YA
JAWAB BAASSDDFFF
(interaksi selesai)
Subsoal
Pada semua subsoal, berlaku:

String DNA hanya terdiri atas huruf kapital A s.d. Z
Subsoal 1 (6 poin)



N = 10
K = 10
String DNA hanya terdiri atas huruf A, B, atau C
Subsoal 2 (10 poin)

N = 10
 K = 350
Khusus untuk subsoal 1 dan subsoal 2:




Hanya terdapat sebuah kasus uji (satu subsoal dinyatakan oleh satu kasus uji), yang
berupa game dan dapat dilihat di halaman pengumuman kontes.
Anda boleh memainkan permainan ini berulang kali tanpa mendapatkan penalti.
Jika Anda sudah memenangkan permainan untuk subsoal tertentu, Anda dapat memilih
pilihan pada permainan untuk mengeluarkan source code yang dapat langsung Anda
kirimkan ke grader dan menjawab dengan benar pada subsoal yang telah Anda
menangkan.
Anda tidak diwajibkan memainkan permainan ini untuk mengerjakan kedua subsoal ini.
Anda diperbolehkan untuk menulis kode Anda sendiri untuk mengerjakan kedua subsoal
ini.
Halaman 40 dari 64
Subsoal 3 (31 poin)



N = 26
K = 350
String DNA mengandung semua karakter dari A s.d. Z masing-masing tepat sekali
Subsoal 4 (24 poin)


1 ≤ N ≤ 100
K = 500
Subsoal 5 (29 poin)


1 ≤ N ≤ 1.000
K = 750
Catatan
Yang perlu diperhatikan adalah bahwa untuk tipe soal interaktif seperti ini, Anda harus
selalu memberikan perintah fflush(stdout); (bagi pengguna C/C++) atau flush(output); (bagi
pengguna PASCAL) setiap kali Anda mencetak keluaran (dengan kata lain, setiap kali ada
perintah mencetak keluaran misalnya write, writeln, printf, cout, atau puts, tepat di
bawahnya harus ada perintah fflush/flush).
Sebagai contoh, berikut adalah contoh source code dalam bahasa Pascal yang akan selalu
bertanya "TANYA ABC"dan kemudian menjawab "JAWAB DEF" tanpa mempedulikan nilai N
dan K yang diberikan maupun bacaan hasil interaksi.
var subsoal, jawaban: string;
N, K: longint;
begin
readln(subsoal);
readln(N, K);
writeln('TANYA ABC');
flush(output);
readln(jawaban);
writeln('JAWAB DEF');
flush(output);
end.
Dan berikut adalah contoh source code yang melakukan hal yang sama dalam bahasa C++.
#include <cstdio>
Halaman 41 dari 64
#include <cstring>
char subsoal[100], jawaban[100];
int N, K;
int main() {
gets(subsoal);
scanf("%d %d", &N, &K);
printf("TANYA ABC\n");
fflush(stdout);
gets(jawaban);
printf("JAWAB DEF\n");
fflush(stdout);
return 0;
}
Peringatan
Jika program Anda melakukan salah satu dari hal-hal di bawah ini:

melakukan tindakan di luar format dan batasan yang ditentukan,
 bertanya lebih dari K kali, atau
 salah menjawab DNA
maka nilai Anda untuk subsoal yang bersangkutan adalah nol.
Selain itu, pastikan pula bahwa program Anda harus berhenti jika selesai melakukan
interaksi. BIla tidak, maka Anda mungkin mendapatkan Time Limit Exceeded, Runtime Error,
atau Internal Error untuk kasus uji yang bersangkutan.
Halaman 42 dari 64
Solusi Resmi
Halaman 43 dari 64
0A – Tekotek
#include <bits/stdc++.h>
using namespace std;
int n;
char header[100];
int main() {
scanf("%s", header);
scanf("%d", &n);
while (n) {
printf("Anak ayam turunlah %d\n", n);
n--;
if (n) {
printf("Mati satu tinggallah %d\n", n);
} else {
printf("Mati satu tinggallah induknya\n");
}
}
return 0;
}
Halaman 44 dari 64
0B – Sengketa Tanah
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
char s[10];
scanf("%s",s);
int x[4],y[4];
for (int i=0;i<4;i++)
scanf("%d%d",&x[i],&y[i]);
if (x[0]<x[3] && x[1]>x[2] && y[0]<y[3] && y[1]>y[2])
printf("SENGKETA\n");
else
printf("DAMAI\n");
return 0;
}
Halaman 45 dari 64
0C – Menimbang
#include <bits/stdc++.h>
int l,n,k,awal;
char s[10],label[10];
int main()
{
gets(label);
scanf("%d%d",&n,&k);
l=n/3;
awal=1;
while (l>0)
{
printf("TIMBANG %d ",l);
for (int i=awal;i<awal+l;i++)
{
printf("%d ",i);
}
printf("%d ",l);
for (int i=awal+l;i<awal+l+l-1;i++)
{
printf("%d ",i);
}
printf("%d\n",awal+l+l-1);
fflush(stdout);
scanf("%s",s);
if (strcmp(s,"KIRI")==0)
{
n=l;
l=n/3;
}
else if (strcmp(s,"KANAN")==0)
{
awal=awal+l;
n=l;
l=n/3;
}
else
{
n=n-l-l;
awal=awal+l+l;
l=n/3;
}
//printf("%d\n",awal);
}
if (n>1)
{
printf("TIMBANG 1 %d 1 %d\n",awal,awal+1);
fflush(stdout);
scanf("%s",s);
if (strcmp(s,"KANAN")==0)
{
awal=awal+1;
}
else
{
Halaman 46 dari 64
awal=awal+2;
}
}
printf("AMBIL %d\n",awal);
fflush(stdout);
return 0;
}
Halaman 47 dari 64
1A – Pertahanan Yogya
#include
#include
#include
#include
<cstdio>
<algorithm>
<iostream>
<cstring>
#define fi first
#define se second
using namespace std;
typedef long long ll;
pair<ll,ll> minKill[100100];
ll Sd,Td,Ls,Lt,n,Si,Ti,kill[100100];
bool bisa;
char s[10];
ll bagi(ll a,ll b)
{
return (a+b-1)/b;
}
bool berantem(ll S1,ll T1,ll S2,ll T2)
{
ll dengklek=bagi(S2,T1);
ll monster=bagi(S1,T2);
return (dengklek <= monster);
}
ll binSearch(ll S,ll T)
{
ll il=0;
ll ir=n;
while (il<ir)
{
ll p=(il+ir)/2;
if (berantem(Sd+p*Ls,Td+p*Lt,S,T))
{
ir=p;
}
else
{
il=p+1;
}
}
return il;
}
int main()
{
gets(s);
scanf("%lld%lld%lld%lld%lld",&Sd,&Td,&Ls,&Lt,&n);
Halaman 48 dari 64
scanf("%lld%lld",&Si,&Ti);
minKill[0].fi=binSearch(Si,Ti);
minKill[0].se=0;
for (ll i=1;i<n;i++)
{
scanf("%lld%lld",&Si,&Ti);
minKill[i].fi=binSearch(Si,Ti);
minKill[i].se=i+1;
//cout << minKill[i].fi << minKill[i].se << endl;
}
sort(minKill+1,minKill+n);
bisa=(minKill[0].fi<=(n-1));
for (ll i=1;i<=minKill[0].fi;i++)
{
if (minKill[i].fi>=i) bisa=false;
kill[i]=minKill[i].se;
}
if (bisa)
{
printf("%lld\n",minKill[0].fi);
for (ll i=1;i<=minKill[0].fi;i++)
{
printf("%lld\n",kill[i]);
}
}
else
{
printf("-1\n");
}
return 0;
}
Halaman 49 dari 64
1B – Menyiram Sawah
#include<bits/stdc++.h>
using namespace std;
int n,m,q,a,b,c,d;
int arr[1005][1005];
int cnt[1005][1005], kiri[1005][1005], kanan[1005][1005],
atas[1005][1005], bawah[1005][1005];
int dr[4] = {1, -1, 0, 0};
int dc[4] = {0, 0, 1, -1};
bool valid(int row, int col){
return (0 <= row && row < n && 0 <= col && col < m);
}
int isi(int ra, int ca, int rb, int cb){
int ret = cnt[rb][cb];
if (ra > 0) ret -= cnt[ra-1][cb];
if (ca > 0) ret -= cnt[rb][ca-1];
if (ra > 0 && ca > 0) ret += cnt[ra-1][ca-1];
return ret;
}
int isiatas(int ra, int ca, int rb, int cb){
int ret = atas[rb][cb];
if (ra > 0) ret -= atas[ra-1][cb];
if (ca > 0) ret -= atas[rb][ca-1];
if (ra > 0 && ca > 0) ret += atas[ra-1][ca-1];
return ret;
}
int isikanan(int ra, int ca, int rb, int cb){
int ret = kanan[rb][cb];
if (ra > 0) ret -= kanan[ra-1][cb];
if (ca > 0) ret -= kanan[rb][ca-1];
if (ra > 0 && ca > 0) ret += kanan[ra-1][ca-1];
return ret;
}
int isibawah(int ra, int ca, int rb, int cb){
int ret = bawah[rb][cb];
if (ra > 0) ret -= bawah[ra-1][cb];
if (ca > 0) ret -= bawah[rb][ca-1];
if (ra > 0 && ca > 0) ret += bawah[ra-1][ca-1];
return ret;
}
int isikiri(int ra, int ca, int rb, int cb){
int ret = kiri[rb][cb];
if (ra > 0) ret -= kiri[ra-1][cb];
if (ca > 0) ret -= kiri[rb][ca-1];
if (ra > 0 && ca > 0) ret += kiri[ra-1][ca-1];
return ret;
Halaman 50 dari 64
}
int cek(int ra, int ca, int rb, int cb){
if (ra+1 <= rb-1 && ca+1 <= cb-1){
if (isi(ra+1,ca+1,rb-1,cb-1) > 0) return 0;
}
if (ca+1 <= cb-1){
if (isiatas(ra,ca+1,ra,cb-1) > 0) return 0;
if (isibawah(rb,ca+1,rb,cb-1) > 0) return 0;
}
if (ra+1 <= rb-1){
if (isikiri(ra+1,ca,rb-1,ca) > 0) return 0;
if (isikanan(ra+1,cb,rb-1,cb) > 0) return 0;
}
if (ra != rb){
if (arr[ra][cb] >= arr[ra][cb-1] && arr[ra][cb] >=
arr[ra+1][cb]) return 0;
if (arr[rb][ca] >= arr[rb][ca+1] && arr[rb][ca] >= arr[rb1][ca]) return 0;
if (arr[ra][ca] > arr[ra][ca+1] && arr[ra][ca] > arr[ra+1][ca]
&& !(arr[rb][cb] >= arr[rb][cb-1] && arr[rb][cb] >= arr[rb-1][cb])) return
1;
if (arr[rb][cb] > arr[rb][cb-1] && arr[rb][cb] > arr[rb-1][cb]
&& !(arr[ra][ca] >= arr[ra][ca+1] && arr[ra][ca] >= arr[ra+1][ca])) return
2;
} else{
if (arr[ra][ca] > arr[ra][ca+1] && !(arr[ra][cb] >=
arr[ra][cb-1])) return 1;
if (arr[ra][cb] > arr[ra][cb-1] && !(arr[ra][ca] >=
arr[ra][ca+1])) return 2;
}
return 0;
}
char header[100];
int main(){
gets(header);
scanf("%d %d %d",&n,&m, &q);
memset(cnt,0,sizeof(cnt));
memset(atas,0,sizeof(atas));
memset(bawah,0,sizeof(bawah));
memset(kiri,0,sizeof(kiri));
memset(kanan,0,sizeof(kanan));
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
scanf("%d",&arr[i][j]);
for (int i = 0; i < n; ++i){
for (int j = 0; j < m; ++j){
Halaman 51 dari 64
cnt[i][j] = atas[i][j] = bawah[i][j] = kiri[i][j] =
kanan[i][j] = 1;
for (int k = 0; k < 4; ++k){
if (!valid(i+dr[k],j+dc[k])) continue;
cnt[i][j] &= (arr[i][j] >= arr[i+dr[k]][j+dc[k]]);
if (k != 0) bawah[i][j] &= (arr[i][j] >=
arr[i+dr[k]][j+dc[k]]);
if (k != 1) atas[i][j] &= (arr[i][j] >=
arr[i+dr[k]][j+dc[k]]);
if (k != 2) kanan[i][j] &= (arr[i][j] >=
arr[i+dr[k]][j+dc[k]]);
if (k != 3) kiri[i][j] &= (arr[i][j] >=
arr[i+dr[k]][j+dc[k]]);
}
}
}
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j){
if (i > 0) {
cnt[i][j] += cnt[i-1][j];
bawah[i][j] += bawah[i-1][j];
atas[i][j] += atas[i-1][j];
kiri[i][j] += kiri[i-1][j];
kanan[i][j] += kanan[i-1][j];
}
if (j > 0){
cnt[i][j] += cnt[i][j-1];
bawah[i][j] += bawah[i][j-1];
atas[i][j] += atas[i][j-1];
kiri[i][j] += kiri[i][j-1];
kanan[i][j] += kanan[i][j-1];
}
if (i > 0 && j > 0){
cnt[i][j] -= cnt[i-1][j-1];
bawah[i][j] -= bawah[i-1][j-1];
atas[i][j] -= atas[i-1][j-1];
kiri[i][j] -= kiri[i-1][j-1];
kanan[i][j] -= kanan[i-1][j-1];
}
}
while (q--){
scanf("%d %d %d %d",&a,&b,&c,&d);
a--; b--; c--; d--;
if (cek(a,b,c,d) == 1)
puts("Kiri Atas");
else if (cek(a,b,c,d) == 2)
puts("Kanan Bawah");
else
puts("Tidak Mungkin");
}
}
Halaman 52 dari 64
1C – Bisa Jadi Tebak Angka
#include
#include
#include
#include
#include
#include
<cstdio>
<cstdlib>
<cstring>
<iostream>
<vector>
<algorithm>
using namespace std;
int n,k,start,cur_k,i,j;
int three[20];
char s[1007];
bool isConsecutive;
vector<int> guess;
void consecutive_numbers(int k) {
int i;
for (i=1 ; i<=three[k-1] ; i++) {
guess.push_back(2*i - 1);
}
}
void numbers_separated_by_two(int k) {
int i;
for (i=1 ; i<=three[k-1] ; i++) {
guess.push_back(2*i - 1);
}
for (i=three[k-1] ; i<=2*three[k-1]-1 ; i++) {
guess.push_back(2*i);
}
}
int main() {
gets(s);
if (s[4] == '4') return 0;
three[0] = 1;
for (i=1 ; i<20 ; i++) three[i] = 3 * three[i-1];
scanf("%d%d",&n,&k);
gets(s);
k = 0;
int threek = 1;
while (threek < n) {
threek *= 3;
k++;
}
Halaman 53 dari 64
start = 1;
cur_k = k;
isConsecutive = true;
for (i=0 ; i<k ; i++) {
guess.clear();
if (isConsecutive) {
consecutive_numbers(cur_k);
} else {
numbers_separated_by_two(cur_k);
}
for (j=0 ; j<guess.size() ; j++) {
guess[j] += start - 1;
}
printf("%d",guess.size());
fflush(stdout);
for (j=0 ; j<guess.size() ; j++) {
printf(" %d",guess[j]);
fflush(stdout);
}
printf("\n");
fflush(stdout);
gets(s);
if (isConsecutive) {
if (s[0] == 'Y') {
isConsecutive = false;
} else if (s[0] == 'T') {
start += 2 * three[cur_k-1];
} else {
isConsecutive = false;
start++;
}
} else {
if (s[0] == 'Y') {
// nothing
} else if (s[0] == 'T') {
start += 4 * three[cur_k-1];
} else {
start += 2 * three[cur_k-1];
}
}
cur_k--;
}
printf("0 %d\n",start);
fflush(stdout);
}
Halaman 54 dari 64
Halaman 55 dari 64
2A – Belanja di Malioboro
#include "iostream"
#include "cstdio"
#include "cmath"
#include "queue"
#include "algorithm"
#include "climits"
#define A first
#define B second
#define mp make_pair
using namespace std;
int n,m,k,p[260000],u[260000];
bool flag[1010000];
int bf[1010000];
int main()
{
char s[10];
scanf("%s",s);
scanf("%d%d%d",&m,&n,&k);
for (int i = 0; i < n; ++i)
{
scanf("%d%d", &p[i],&u[i]);
}
bool tabrak = false;
int min_bf = INT_MAX;
for (int i = 0; i < n-1; ++i)
{
for (int j = i+1; j < n; ++j)
{
if (u[i]!=u[j])
{
tabrak = true;
int x = min(abs(2*p[i]-2*p[j]),2*m-abs(2*p[i]2*p[j]));
int ap1, ap2;
ap1 = 2*p[i]+u[i];
ap2 = 2*p[j]+u[j];
ap1 %= 2*m;
ap2 %= 2*m;
if (ap1<0) ap1 += 2*m;
if (ap2<0) ap2 += 2*m;
int y = min(abs(ap1-ap2),2*m-abs(ap1-ap2));
if (x<=y)
{
int z;
z = m - x/2;
int az = z;
flag[z] = true;
z+=m;
z%=2*m;
Halaman 56 dari 64
flag[z] = true;
z+=m;
z%=2*m;
flag[z] = true;
z+=m;
z%=2*m;
}
else
{
int z;
z = x/2;
flag[z] = true;
z+=m;
z%=2*m;
flag[z] = true;
z+=m;
z%=2*m;
flag[z] = true;
z+=m;
z%=2*m;
}
}
else
{
int x = min(abs(p[i]-p[j]),m-abs(p[i]-p[j]));
min_bf = min(min_bf,x);
}
}
}
queue<pair<int,int> > q;
for (int i = 0; i < 2*m; ++i)
{
if (flag[i])
{
q.push(mp(i,0));
flag[i] = false;
}
}
while (!q.empty())
{
int pos = q.front().A;
if (pos < 0)
pos += 2*m;
int l = q.front().B;
//cout<< pos << " " << l <<endl;
q.pop();
if (!flag[pos])
{
flag[pos] = true;
bf[pos] = l;
q.push(mp((pos+1)%(2*m),l+1));
q.push(mp(pos-1,l+1));
}
Halaman 57 dari 64
}
if (!tabrak)
{
int mins = INT_MAX;
for (int i = 0; i < n-1; ++i)
{
for (int j = i+1; j < n; ++j)
{
int x = min(abs(p[i]-p[j]),m-abs(p[i]-p[j]));
mins = min(x,mins);
}
}
for (int i = 0; i < 2*m; ++i)
{
bf[i] = mins;
}
}
for (int i = 0; i < k; ++i)
{
int x;
scanf("%d",&x);
printf("%d\n",min(bf[(x*2)%(2*m)], min_bf));
}
return 0;
}
Halaman 58 dari 64
2B – Motif Batik
#include <bits/stdc++.h>
#define
#define
++i)
#define
#define
#define
#define
#define
#define
#define
#define
#define
sz(a) int((a).size())
tr(i,c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end();
#define
#define
#define
#define
INF
EPS
pb
mp
1000111222
1e-9
push_back
make_pair
#define
#define
#define
#define
fi
se
X
Y
first
second
first
second
all(c) (c).begin(),(c).end()
uniq(c) sort(all((c))); (c).resize(unique(all((c))) - (c).begin())
lobo(c, x) (int) (lower_bound(all((c)), (x)) - (c).begin())
upbo(c, x) (int) (upper_bound(all((c)), (x)) - (c).begin())
R(i,a,b) for (int i=a; i<=b; i++)
stop getchar();
tess puts("===========");
tes(a) cerr<<#a << " = "<<a<<endl;
cincout ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef long long int64;
int64
sum[100111];
vector<int64> mem[100111];
vector<int64> tmp;
int64 n,m,a,b;
inline int64 con(vector<int64> &v) {
if (sz(v) == 0) return 0;
sort(all(v));
sum[0] = v[0];
R(i,1,sz(v)-1) sum[i] = sum[i-1] + v[i];
int64 ret = 0;
R(i,1,sz(v)-1) {
ret += v[i]*i - sum[i-1];
}
Halaman 59 dari 64
return ret;
}
string s;
int main () {
cincout;
cin >> s;
cin >> n >> m;
for (int i=0; i<n; i++) {
cin >> a >> b;
mem[a].push_back(b);
tmp.push_back(b);
}
int64 ans = con(tmp);
R(i,1,m) ans -= con(mem[i]);
assert(ans>=0);
cout << ans <<endl;
}
Halaman 60 dari 64
2C – Ayam Aneh
#include <bits/stdc++.h>
using namespace std;
// for debuging purposes
#define MAXK 650
int _k_query = 0;
bool query(string s) {
if (++_k_query > MAXK) {
exit(0);
}
printf("TANYA %s\n", s.c_str());
fflush(stdout);
char response[10];
scanf("%s", response);
return strcmp(response, "YA") == 0;
}
void answer(string s) {
printf("JAWAB %s\n", s.c_str());
fflush(stdout);
exit(0);
}
char header[10];
string a[30];
int n, q;
int main() {
// read headers
scanf("%s", header);
// read N and Q
scanf("%d%d", &n, &q);
// a[i] = i-th alphabet
for (int i = 0; i < 26; ++i) {
a[i] = ""; a[i] += 'A' + i;
}
// determine the character used
vector<int> c;
if (header[1] == '1') {
// only ABC
c.push_back(0);
c.push_back(1);
c.push_back(2);
} else if (header[3] == '3') {
// all A-Z appear
Halaman 61 dari 64
for (int i = 0; i < 26; ++i) {
c.push_back(i);
}
} else {
for (int i = 0; i < 26; ++i) {
if (query("" + a[i])) {
c.push_back(i);
}
}
}
// determine the order of the characters
if (c.size() > 1) {
vector<bool> used(c.size());
used[0] = true;
vector<int> r, l;
// determine r
string sr = a[c[0]];
while (true) {
bool cont = false;
for (int i = 0; i < c.size(); ++i) {
if (used[i]) continue;
if (query(sr + a[c[i]])) {
r.push_back(c[i]);
sr = a[c[i]];
cont = true;
used[i] = true;
break;
}
}
if (!cont) break;
}
// determine l
string sl = a[c[0]];
while (true) {
bool cont = false;
for (int i = 0; i < c.size(); ++i) {
if (used[i]) continue;
if (query(a[c[i]] + sl)) {
l.push_back(c[i]);
sl = a[c[i]];
cont = true;
used[i] = true;
break;
}
}
if (!cont) break;
}
// combine them
vector<int> temp;
for (int i = l.size() - 1; i >= 0; --i) {
Halaman 62 dari 64
temp.push_back(l[i]);
}
temp.push_back(c[0]);
for (int i = 0; i < r.size(); ++i) {
temp.push_back(r[i]);
}
c = temp;
}
// do binary search to determine the number of each character
int total = 0;
string ans = "";
if (header[4] == '4') {
for (int i = 0; i + 1 < c.size(); ++i) {
ans.push_back(a[c[i]][0]);
if (header[3] == '3') {
// always 1 character, so do nothing
} else {
while (query(ans + a[c[i]][0])) {
ans.push_back(a[c[i]][0]);
}
}
}
total = ans.size();
for (int i = 0; i < n - total; ++i) {
ans.push_back(a[c.back()][0]);
}
} else {
for (int i = 0; i + 1 < c.size(); ++i) {
int l = 1, r = n - total;
// for subtask 3: always 1
if (header[3] == '3') {
r = 1;
}
while (l < r) {
int m = (l + r + 1) / 2;
string tempq = "";
for (int j = 0; j < m; ++j) {
tempq += a[c[i]];
}
if (query(tempq)) {
l = m;
} else {
r = m - 1;
}
}
total += l;
for (int j = 0; j < l; ++j) {
ans.push_back(a[c[i]][0]);
}
}
for (int i = 0; i < n - total; ++i) {
ans.push_back(a[c.back()][0]);
}
Halaman 63 dari 64
}
answer(ans);
return 0;
}
Halaman 64 dari 64
Download