Mengembalikan sebuah Kesalahan Kacau

advertisement
InternationalOlympiadinInformatics2016
12-19thAugust2016
Kazan,Russia
messy
day2_2
Country:IDN
MengembalikansebuahKesalahanKacau
Ilshatadalahseorangsoftwareengineeryangbekerjadalamdatastrukturyang
efisien.Suatuhariiamenemukansebuahdatastrukturbaru.Datastrukturinidapat
menyimpansebuahhimpunanbilanganintegernon-negatif n -bit,yangmana n
adalahsebuahbilanganduapangkat.Dengankatalain, n
integernon-negatif b .
= 2b untuksuatubilangan
Datastrukturtersebutmula-mulakosong.Sebuahprogrammenggunakandata
strukturtersebutharusmengikutiaturan-aturanberikut:
Programdapatmenambahkanbilanganinteger n -bitkedalamdatastruktur,
satupersatu,denganmenggunakanfungsiadd_element(x).Jikaprogram
mencobamenambahkansebuahelemenyangtelahadadidalamdatastruktur,
tidakakanadayangterjadi.
Setelahmenambahkanelementerakhirprogramharusmemanggilfungsi
compile_set()tepatsekali.
Padaakhirnya,programbolehmemanggilfungsicheck_element(x)untuk
mengujiapakahelemen x adadalamdatastruktur.Fungsiinidapatdigunakan
beberapakali.
KetikaIlshatmengimplementasidatastrukturiniuntukpertamakali,diamelakukan
sebuahkesalahandalamfungsicompile_set().Kesalahannyamenyusunulangdigit
binaryuntuktiapelemenpadahimpunandengancarayangsama.Ilshat
menginginkanAndauntukmencarisusunanulangdigityangtepatyangdisebabkan
olehkesalahantersebut.
Secararesmi,pertimbangkansebuahurutan p = [p0 , … , pn−1 ] yangmanasetiap
angkadari 0 sampai n − 1 muncultepatsekali.Kitamenyebuturutantersebut
adalahsebuahpermutasi.Pertimbangkansebuahelemendarihimpunan,dimana
digit-digitnyadalambinaryadalah a0 , … , an−1 (dengan a0 adalahbityangpaling
signifikan).Ketikafungsicompile_set()dipanggil,elemeninidigantidengan
elemen ap0 , ap1 , … , apn−1 .
Permutasi p yangsamadigunakanuntukmenyusunulangdigit-digitdarisemua
elemen.Semuapermutasimungkin,termasukkemungkinanyangmana pi = i
untuksetiap 0 ≤ i ≤ n − 1 .
Sebagaicontoh,anggapbahwa n = 4 , p = [2, 1, 3, 0] ,danAndatelah
menambahkankehimpunanbilanganintegeryangmemilikirepresentasibinary
0000,1100dan0111.Memanggilfungsicompile_setmenggantielemen-elemenini
menjadi0000,0101and1110,secaraberurutan.
1/4
TugasAndaadalahmenuliskansebuahprogramyangmencaripermutasi p dengan
berinteraksidengandatastruktur.Programtersebutharus(denganurutanberikut):
1. memilihsebuahhimpunanbilanganinteger n -bit,
2. menambahkanbilangan-bilanganintegertersebutkedatastruktur,
3. memanggilfungsicompile_setuntukmencetuskankesalahan,
4. mengujiadanyabeberapaelemendarihimpunanyangtelahdiubah,
5. menggunakaninformasitersebutuntukmenentukandanmengembalikan
permutasi p .
PerhatikanbahwaprogramAndabolehmemanggilfungsicompile_sethanyasekali.
Sebagaitambahan,terdapatsebuahbatasandaribanyaknyapanggilanprogram
Andakefungsilibrary.Yaitu,programAndadapat
memanggiladd_elementpalingbanyak w kali( w adalahuntuk"writes"),
memanggilcheck_elementpalingbanyak r kali( r adalahuntuk"reads").
Rincianimplementasi
Andaharusmengimplementasikanfungsi(method):
int[]restore_permutation(intn,intw,intr)
n:banyaknyabitpadarepresentasibinarydaritiapelemenpadahimpunan
(danjugapanjangdari p ).
w:banyaknyaoperasiadd_elementmaksimumyangprogramAndadapat
lakukan.
r:banyaknyaoperasicheck_elementmaksimumyangprogramAnda
dapatlakukan.
fungsiharusmengembalikanpermutasi p .
Fungsilibrary
Untukberinteraksidengandatastruktur,programAndaharusmenggunakantiga
fungsi(methods)berikutini:
voidadd_element(stringx)
Fungsiinimenambahkanelemenyangdideskripsikanolehxkedalam
himpunan.
x:sebuahstringberisikarakter'0'dan'1'memberikanrepresentasi
binarydarisebuahbilanganintegeryangakanditambahkanpada
himpunan.Panjangdarixharus n .
voidcompile_set()
Fungsiiniharusdipanggiltepatsekali.ProgramAndatidakdapatmemanggil
add_element()setelahpemanggilanini.ProgramAndatidakdapatmemanggil
check_element()sebelumpemanggilanini.
booleancheck_element(stringx)
Fungsiinimengujiapakahelemenxadadalamhimpunanyangtelahdiubah.
x:sebuahstringberisikarakter'0'dan'1'memberikanrepresentasi
binarydarielemenyangakandiuji.Panjangdarixharus n .
mengembalikantruejikaelemenxadadalamhimpunanyangtelah
diubah,danfalsejikatidak.
2/4
PerhatikanbahwajikaprogramAndamelanggarsalahsatudaribatasandiatas,hasil
gradingakan"WrongAnswer".
Untuksetiapstring,karakterpertamamemberikanbitpalingsignifikanuntuk
bilanganintegeryangsesuai.
Gradermenetapkanpermutasi p sebelumfungsirestore_permutationdipanggil.
Gunakanfiletemplateyangsudahdisediakanuntukimplementasirincidaribahasa
pemrogramanyangAndapakai.
Contoh
Gradermelakukanpemanggilanfungsiberikut:
restore_permutation(4,16,16).Kitamemiliki n
melakukanpalingbanyak 16 "writes"dan 16 "reads".
= 4 danprogramdapat
Programmelakukanpemanggilanfungsiberikut:
add_element("0001")
add_element("0011")
add_element("0100")
compile_set()
check_element("0001")mengembalikanfalse
check_element("0010")mengembalikantrue
check_element("0100")mengembalikantrue
check_element("1000")mengembalikanfalse
check_element("0011")mengembalikanfalse
check_element("0101")mengembalikanfalse
check_element("1001")mengembalikanfalse
check_element("0110")mengembalikanfalse
check_element("1010")mengembalikantrue
check_element("1100")mengembalikanfalse
Hanyasatupermutasiyangkonsistendengannilai-nilaiyangdikembalikanoleh
check_element():permutasi p = [2, 1, 3, 0] .Jadi,restore_permutationharus
mengembalikan[2,1,3,0].
Subtasks
= 8 , w = 256 , r = 256 , pi ≠ i untukpalingbanyak2indeks i (
0 ≤ i ≤ n − 1 ),
2. (18poin) n = 32 , w = 320 , r = 1024 ,
3. (11poin) n = 32 , w = 1024 , r = 320 ,
4. (21poin) n = 128 , w = 1792 , r = 1792 ,
5. (30poin) n = 128 , w = 896 , r = 896 .
1. (20poin) n
Grader
Gradermembacamasukandenganformatberikut:
baris1:bilanganinteger n , w , r ,
baris2: n bilanganintegermemberikanelemen-elemendari p .
3/4
4/4
Download