Sabtu, 27 Agustus 2016

A Little Note

  Jadi hari ini ceritanya resmi 19 tahun. Reaksiku:
  • Dafuq udah tua
  • Dafuq aku bisa bertahan hidup selama ini
Well, I guess not many people will understand why i write the second one. Ada beberapa hal yang harus dicatat mungkin untuk setahun terakhir ini:

  • Bisa kuliah :O
  • Bisa ikut lomba CP dan menang beberapa :O
  • Bisa jadi Scientific Committee di TOKI buat Pelatnas sama OSN :O
  • Bisa bikin soal CP :O
  • Bisa nyiapin kontes bersama yang lain :O
  • Tambah gendut :(
  • Tambah retard :(
  • Ndak kuning-kuning di CF :(
  • Koleksi rating change satu digit semakin banyak :(
  • Nyandu nonton anime :/
  • Nambah koleksi cerita retard buat anak cucu (kalo punya) ^^
Mungkin ada lagi yang harusnya dicatat, tapi yasudahlah. Aku juga aslinya bukan orang yang peduli masalah beginian sih :/

Yang lebih pengen kutulis, tentang kontes CP.

Beberapa waktu yang lalu, ada penyisihan CPC CompFest 8 kan ya? Mungkin sudah tahu, tapi aku jadi panitia di situ. Maafkan kalo masih banyak kekurangan pas kontes, semoga di final kontesnya bisa lebih baik lagi.

Dalam bikin kontes, salah satu yang sering kudenger: "Kontes yang bagus itu yang semua solve at least 1, semua solve ada yang solve, dan ga ada yang solve semua". Well, untuk kontes penyisihan kemaren, kami mencoba mempersiapkan dengan mempertimbangkan itu. Oiya, scoreboard akhirnya bisa dilihat di:

Mungkin bakal keliatan kalo yang SCPC ga ngikutin yang ditulis di atas (ada yang ga disolve), walaupun secara teknis, semua soal di penyisihan ini disolve setidaknya satu peserta (soal G SCPC juga muncul di JCPC, bedanya cuma di SCPC multi-tc).

Nah, kenapa aku bahas ini? Jadi, kemaren baru aja penyisihan Gemastik cabang pemrograman. Aku ikut sama Zamil dan Rakina, di tim Ristek - Kuikutsaja. Alhamdulillah, kemaren lagi ga retard, jadi hasilnya.. bisa dibilang memuaskan? Oh, dan soal-soalnya menurutku keren-keren :) dan aku cukup menikmati soal-soalnya.

Hal ini, membuatku berpikir lagi. Sebetulnya, target kontes itu apa? Kontes dengan hasil yang bagus seperti itu? Atau apa?

Aku yakin aku sudah sering mikir hal berikut, tapi mungkin kutulis di sini aja biar ntar di masa depan bisa bikin counter berapa kali mikir begini: "Yang penting yang ngerjain menikmati kontesnya. Entah karena kepuasan mendapatkan AC, atau karena mendapatkan sesuatu yang baru". Tentu saja, membuat kontes yang bagus berdasarkan kriteria di atas juga bisa dirasa cukup penting :P

Udah cukup kali ya ngebacot siang ini :P Semoga bisa nyiapin final CPC yang lebih baik dari penyisihannya >.< Dan bisa kagebunshin in case semua terlalu sibuk untuk live commentary >.<

Jumat, 12 Agustus 2016

Pelatnas 4 TOKI 2016

*bersihin debu*

Jadi mungkin sebagian besar dari kalian sudah tahu, kalau sekarang kontingen Indonesia untuk IOI sudah sampai di Kazan. Lomba benerennya masih 2 hari lagi sih mulainya. Padahal, sampai 2 hari yang lalu masih Pelatnas 4 loh. Sekalian bersihin debu di blog ini, aku mau nulis apa aja yang kulakuin selama P4, dari yang emang pas P4, atau yang technically di luar P4, kayak TOKI Open Contest Juli 2016. Apa kalian sadar kalau aku pakai kata ganti aku? Yah, habis kalo dipikir-pikir, "boku" lebih enak daripada "watashi". Dah, back to topic deh.

Persiapan P4 kalo gak salah udah dari sebulan~2 bulan sebelumnya. Masalah pertama justru nyari asisten. Kebanyakan anak TOKI di UI magang atau ada urusan lain pas masa-masa P4. Jadinya sampe nyari asisten dari luar. Untungnya, ada Prabowo sama Xing-Xing :") Selain itu, Irvin dihitung asisten ndak ya (?) btw, baru nyadar ini asistennya beda univ semua :O

Setelah asisten beres, masalah lanjutnya itu jadwal. Awalnya, Irvin udah nyiapin jadwal dengan asumsi Pelatnas 3~4 minggu. Terus kepotong jadi 2 minggu. Jeder. Potong banyak, gabungin banyak, jadi deh jadwal baru. Di jadwal baru, Pelatnas mulai ada latian dari tanggal 28. Jadinya, aku sama Prabowo beli tiket tanggal 27. Menjelang Pelatnas, tau-tau jadwalnya digeser sehari, jadi mulai ada latian dari tanggal 29. Which means kami kecepetan sehari. Jeder lagi. Untung aku udah bayar kos, kalo nggak mungkin kami menggelandang di sekitar UI.

Tanggal 27 aku pun cabut ke Jakarta. Pas di Jakarta, nungguin dulu Prabowo, biar bisa naik taksi bareng ke Depok (biar bisa patungan huehue). Sampe di kos, diminta ke UI dulu untuk ini-itu-buat-pelatnas. Nggak banyak sih yang dilakuin, cuma kontak Bu Aya, terus nambahin sublime sama apcalc di komputer yang nantinya dipake peserta. Sorenya, habis makan mi instan yang tentunya semua orang Indonesia tahu, kami balik ke kosanku. Nah, kan itu H-3 TOKI Open Contest, sementara masih banyak komponen soal yang belom siap :") aku sendiri belum bikin deskripsi soal sama sekali. Alhasil, malamnya aku bikin deskripsi. Entah kenapa, bikin solusi sama generator testcase rasanya lebih mudah daripada bikin deskripsi :"" Aku habisin 2~4 jam untuk bikin deskripsi Rammeow sama Ramduel :"" Oh iya, tengah malam ada sesi briefing bersama Irvin, yang Agus juga tau-tau nongol. Briefingnya biasa aja, yang ga biasa paling cuma habisin setengah jam coba nelpon HP-nya Irvin. Itu juga ga dapet hasil yang diharapkan. Belakangan diketahui itu karena Irvin retard.

Besoknya, setelah sukses bangun agak siangan, kami lalu siap-siap cabut ke Wisma Polimedia. Ya, nginepnya tahun ini di situ. Oh iya, walaupun gitu, aku lebih sering di kos, karena lebih nyaman juga, walaupun jadinya nggak dapet makan pagi sama malam x( Pas nyampe, ternyata pesertanya juga udah pada nyampe. Hasilnya, sore itu dihabiskan main CS. Malamnya, aku sama Prabowo nyicil urusan P4. Selain itu, aku juga mulai nonton Love Live! (jangan tanya kenapa).

Besoknya pun P4 dimulai. Setelah pembukaan, + aku ngebacot kayak briefing P4, peserta (kedepannya nyebutnya GoF ya :P) mulai latihan. Nggak ada yang signifikan sih buat hari pertama. Actually, masih harus ngetes-ngetes soal TOKI Open Contest sama simulasi P4, tapi karena aku ga bisa ngurutin prioritas, aku lanjut nonton anime. Oh iya, kayak biasanya, Pak Yugo bikin kopi di Pelatnas ini. Nah, berhubung aku tahun lalu ga sempet bikin kopi gegara P4 pas puasa, aku baru belajar bikinnya kemaren :P Nah, masalahnya, kopi yang dibikin kebanyakan gegara GoF pada ndak suka minum kopi :""" Akhirnya aku minum 3 gelas, sudah jauh lebih banyak dari dosis kopi yang kuminum selama satu tahun :"

Hari Sabtu, simulasi pertama P4. Sambil ngamatin simulasi, aku lagi-lagi nonton anime. Selain itu, juga nyoba update soal buat TOKI Open Contest berdasarkan review tester. Nah, terus hari ini, jumlah kopinya kayak hari sebelumnya, firasat nggak enak :( Habis simulasi selesai, istirahat sejenak, terus GoF dihajar Speed Practice. Karena bosen, aku sama Prabowo juga ikut :P ez win :P Di lain pihak, Ucrut, capek dihajar simulasi, bahkan udah ga kuat ngerjain soal Div 2 C. Lemah kamu crut.

GG WP
 Dan bagaimana nasib kopi yang banyak itu? Kuminum 5 gelas. Mati.

Sorenya, habis hujan-hujanan demi mencapai kos, aku nyoba internetan. Jahannamnya, inetnya CUPU PARAH. Jadi ngeri buat TOKI Open Contestnya, tapi bodo lah. Pas TOKI Open Contest, awalnya horor karena first AC nya aja cukup lama (10 menit), tapi ke belakangnya udah nggak terlalu masalah. Ada sih masalah, jadinya naikin memory limit Ramduel biar O(N^3) lolos pake int. Selain itu, aku agak kesel karena ada beberapa klarifikasi yang agak retard :/ tapi ya bodo lah. Oh iya, aku belum ngucapin sebelumnya, jadi congrats iafir for winning this TOC :D Most likely kami nggak bikin editorial, tapi ini quick solution per soal:

  • Rammon : Ad Hoc, cobain aja per tipe.
  • Rammeow : Misal left[x] menyatakan batas terkiri, sehingga subarray left[x]+1..x itu isinya unik. Pentingnya, left[x] ini non-decreasing. Solusiku untuk soal ini manfaatin binary search, rumus deret aritmetika, sama prefix sum.
  • Ramduel : print(input()). ada proofnya di olimpinfo
  • Ramdom : Bisa cek untuk masing-masing kasus, tapi ujung-ujungnya semua kasus bisa direduce ke suatu cara yang simple.
  • Ramdor : Untuk n >= 3, yang optimal itu nyobain per 3 orang. Oiya, strategi optimal orang jago pasti ngepick support, sampai support*2 >= banyak pemain. Untuk n < 3, harus hati-hati sedikit.
Malamnya, aku susah tidur, dan kebangun jam 3 pagi, terus nggak bisa tidur lagi :" Paginya, chat sama Irvin malah receh parah
jago = receh? karena Ammar juga receh
 Menjelang siang, pas mau tidur, dapet email dari Pak Rully perihal beli batik ke Margo. Ga jadi tidur dah :"" Aku lalu ke Polimedia, pas nyampe lagi pada main. Karena ngantuk parah, aku akhirnya malah tidur di kamarnya Sergio. Pas bangun, ternyata berangkatnya masih sore ;_;

Sorenya, aku, Prabowo, GoF, Pak Rully, sama Pak Fauzan berangkat ke Margo City. Nyampe di sana, ketemu Pak Yugo, terus milih-milih batik. Pas nganggur, jadinya ngomongin soal-soal peluang yang ceritanya kalo dipikir geje pol desu. BTW, berhubung Irvin belom dateng, jadinya ukurannya dia pake patokan ukuranku :P dan yang bikin kaget, ini Sergio sama Klungs kenapa bisa kurus parah ;_; Setelah beli batiknya, kami lalu makan di Marugame. Ini rada random sih milih tempat makannya :P Terus aku cerita kalo pas aku makan di situ aku ndak kenyang. Terus, berhubung Stacia makannya nggak banyak, aku dikasih separo udonnya :D Kurang lebih jadinya gini:

*makan udon*
*kenyang*
*minum teh*
*laper lagi*
Sial.

Habis itu pulang yey :v

Hari senin, diawali Speed Practice. Terus Xing-Xing udah mulai ngasisten :D Paginya, aku ngilang dulu karena mau ngurus ini-itu yang diminta kakakku. Alhasil, sprint Fasilkom -> FEB -> Barel -> Margonda -> Fasilkom. Untung 1 jam beres :D Balik-balik, nontonin Speed Practice, sama nonton anime + ngurusin pembahasan coderclass. Siangnya, aku bawain materi Randomized Algorithm, pake slide tahun-tahun sebelumnya, dengan sangat random. Kurasa aku ga jelas parah pas ngomong x( Habis itu, GoF lanjut latihan. Kayak biasa, Stacia sama Sergio kelar, sementara aku menghabiskan waktu ngetawain Ucrut.

Selasanya, ada materi dari Pak Stef tentang NT sama kriptografi. Pas baca-baca slidenya, ternyata mirip banget sama slide tahun lalu xD Hari itu juga Prabowo balik ke Medan :'( Sisi positifnya, jadi ada ngurus "gaji"-nya Prabowo ke Bu Aya, dan bisa ngeskip sebagian materi :P Walaupun ntar ada kena karma sih haha. Siangnya ada simulasi. Ada satu soal yang kuurus dan deskripsinya panjangnya kayak setan, untung ada yang ngerjain. Kalo nggak.. well.. :'( Sorenya, kayak biasa Depok hujan deras. Dan malamnya, berhubung hari selasa.. nge-rush beresin pembahasan coderclass sama Agus sampe larut malam :( kebiasaan deadliner ini ndak pernah beres. Sisi positifnya, pas selesai, bisa leha-leha selama seminggu lagi, sampe nge-rush lagi.

Besoknya, acara seharian cuma repeating soal pelatnas-pelatnas sebelumnya. Soal yang dibuka banyak pol desu, cukup yakin nggak sempet selesai semua. Karena pas P3 gak sempet jelasin, jadinya aku jelasin soal Elephants - IOI 2011. Ada 2 hal related to CP yang bisa dihighlight hari ini:

  1. Sebisa mungkin sebaiknya ada 2 orang yang nyiapin solusi.
  2. Kalo bisa, masukin testcase manual yang tricky. Karena manual, kecil juga nggak masalah.
Ini kutulis untuk reminder di masa depan juga.
Selain itu, aku juga lumayan terkejut pas ada yang solve soal yang kukira terlalu aneh untuk disolve. Btw, kalo ingatanku ga salah, hari ini pada main seri terbaru dari seri Henry Stickman, game yang aku tau gara-gara dulu adekku sering mainin :P yang baru ini kocak parah dah.
Seharusnya, aku udah mulai nyicil kerjaan untuk simulasi terakhir. Tapi, berhubung tanggung kalo ga nyelesein Love Live!, akhirnya aku nge-rush nonton 5 episode terakhir + Movienya.

Keputusan yang salah.
Karena setelah selesein semua bagian animenya, aku ngerasa hampa.
To the point besoknya pengen bawa bantal ke Fasilkom, dan tidur seharian.
:'(
Esoknya, niat bawa bantal diurungkan. Bukan karena gak etis. Tasku nggak muat kumasukin bantal.

Hari Kamis diawali simulasi. Sambil GoF simulasi, ngegalau + ngurusin kerjaan lain. Selesai simulasi, makan, lanjut sesi repeating. Kayak kejadian hari Sabtu, kayaknya udah susah fokus kalo udah dihajar simulasi. Semuanya solve 1 dari 3, terus udah gak fokus. Aku juga malah ngajak main ._. btw, kami main Get On Top, game absurd yang pertama kumainin pas P4 tahun lalu. Ez win ngelawan semua orang :P Ucup ngotot rematch karena kalah mulu. Cupz sih. Malamnya, rusuh beresin simulasi terakhir.

Hari Jum'at, aku bawa tas lain untuk bawa baju ganti, karena mau nginep di Polimedia selama tiga hari kedepan. Jum'at agendanya latihan doang. Secara logis, ga mungkin agendanya gitu doang. Pasti tengah-tengah main kan. Selain itu, si Ucup juga ada wawancara beasiswa, dan Klungs agak demam. Jadinya dibuatin tempat tidur darurat pake kursi, tambah bantal dari tas yang isinya bajuku.

Dewa Klungs kelelahan!
Pas Ucup wawancara, di komputernya ternyata ada essay beasiswanya kebuka. Iseng, aku, Stacia, Sergio, Xing Xing baca. Ada beberapa grammatical error yang ditemuin, tapi yaudahlah. Pasti udah disubmit juga kan. Cuma ya kenapa ga minta orang lain proofread dulu Cup :" Siangnya, pas ishoma, main Get On Top lagi, terus Sergio tau-tau udah jago x( Tentunya Ucup masih Cupz. Xing Xing juga sampe buka video orang main Get On Top di youtube :") Btw, pas main kami juga nyoba mainin dengan aneh-aneh.

still a better love story than twilight
Meanwhile, karena ngantuk, aku akhirnya pake tempat tidur darurat yang tadi dipake Klungs :P Biasanya aku bisa tidur 5 menit doang untuk fresh lagi. Si Ucup bikin code yang banyak pakai kata klungs, to the point that it was unreadable. Sorenya, balik ke Polimedia. Habis makan malam, ada pembicaraan geje yang terjadi antar cowok.


Setelah itu, biar besok ga kesiangan, GoF tidur, sementara aku sama Xing Xing tidurnya masih maleman lagi, ngobrol anime.

Besok paginya pun kami ke Fasilkom kayak biasa, telat dikit karena ga pake jalan pintas dan alhasil muter jauh x( Untungnya simulasinya ga pas jam 8. Oiya, simulasi yang ini nggak kayak biasanya, soalnya ini sparring sama tim Singapura. Ada 2 sesi, yang sabtu ini yang ngurus wong Indo, yang senin nanti wong Singapur. Untuk simulasinya, secara unexpected problemsetnya ternyata bagus :O Walaupun, aku ada buat blunder dan jadinya.. sedikit depresi. Pas simulasi, Klungs agak sakit, dan jadinya dibilang kalo misalnya udah gakuat, stop aja. Nah, menjelang akhir, skornya dia itu bagus, cuma belum nyampah di satu soal. Gregetan, jadinya aku malah live report klungs.

esmosi
Karena Speed Practice ditiadakan dan diganti BNPCHS besoknya, siangnya pun kami langsung balik ke Polimedia. Ucup beda sendiri, pergi ke tempat kakaknya. Di tengah jalan,

"Kecewa lah Yaz"
"Hah?"
"Kecewa"
"Hah!?"

Ternyata karena aku pake baju ICPC Singapura, di hari sparring Indo Vs Singapura. Sialnya, untuk sparring di hari senin aku bakal pake baju yang sama, berhubung baju yang kubawa ke wisma dikit parah.

Nah, pas balik jadinya bingung. Berhubung Klungs sakit, sebaiknya kan dia stay di wisma, karena IOI >> BNPCHS. Sementara itu, artinya harus ada yang jagain. Karena Xing Xing harus ke Binus, artinya aku yang stay. Ujung-ujungnya, ternyata ada ortunya Klungs, jadinya aku juga bisa ke Binus. Nah, biar Klungs ada porsi Speed Practicenya sendiri, alhasil aku juga nyariin kontes yang bisa dipake. Random pick juga sih ujung-ujungnya.

Hari Minggu pagi, udah pada siap-siap ke Binus. Klungs aslinya ngerasa udah enakan, cuma daripada parah lagi.. jadinya stay di Polimedia. Yang ke Binus jadinya aku, Stacia, Sergio, Pak Rully, Xing Xing. Ucup pergi sendiri ke Binus, untung nggak nyasar. Kalo diperhatikan, member ini cukup imbalanced:

  • Xing Xing -> Problemsetter
  • Sergio -> Peserta
  • Aku, Stacia, Pak Rully, Ucup -> Supporter (?) Tukang rusuh (?)
Kayaknya mulai hari ini juga aku kebiasaan ngomong "Nico Nico Nii" walaupun nggak terlalu suka Nico. Karena Xing Xing, jadi ada variannya, "Ucup Ucup Nii". Kayaknya pas registrasi kami rusuh parah deh xD Pas pembukaan juga, ide-ide liar ini keluar:

  • "Xing, tempat beli lightstick deket sini di mana ya? Ntar acung-acungin pas Sergio dipanggil" -Aku
  • "Ndak pake balon yang biasa di main bola itu kah?" -Stacia
  • "Ntar gini ga sih, pas Sergio AC kita teriak dari luar, WOOO SERGIO AC SOAL X" -Lupa
Oh iya, tadi kan dibilang ini BNPCHS buat Speed Practice. Entah banyak yang tahu apa nggak, tapi biasanya di BNPCHS emang ada yang ngedummy, dengan berbagai alasan. Nah, Sergio kan ikut sebagai peserta. Ucup sama Stacia ngedummy. Aku juga ngedummy sih. Salah satu alasan aku ngedummy, biar bisa memperkirakan level peserta untuk CPC CompFest nanti >:)
pindah Binus
Habis pembukaan yang sedeng-sedeng aja, peserta pergi ke ruang lomba. Aku, Ucup, Stacia ke ruang tempat para dummy berkumpul. Xing Xing ke tempat panitia. Pak Rully? Ilang. Entah ke mana. Tak ada yang tahu.

Pas di ruang dummy kan dikasih komputer masing-masing. Nah, jadinya bisa liat scoreboardnya practice session. Ngeliat banyak submission yang kenceng banget, aku malah jadi penasaran, ini orang-orang tau tujuan sebenernya practice session apa nggak :/ Tapi daripada mikirin itu, ada masalah yang lebih penting. Pertama, ndak bisa login. Habis itu, Felix Jingga yang ngurus. Habis ndak bisa login, yang bisa dipake cuma Visual C++. Ada Notepad++, tapi ga ada g++, kalopun ada ga bisa setting environment variable. Panik, Ucup download installer devc++, terus install di tempatnya sama Stacia. Pas di tempatku malah ga kebaca OMG. Terus, ngecek soal yang di website lomba, GG pol desu. Ada PDF, tapi isinya cuma "Soal BNPCHS 2016 Final Round tersedia dalam bentuk tercetak". Like, dafuq. Ini udah habis waktu practice session, dah mau mulai malah. Akhirnya, bisa install devc++, telat semenit atau 2 menit doang untungnya.

Pas mulai, Xing Xing bagiin bentuk tercetak soalnya. Aku lalu baca-baca sekilas. Ah, A ad hoc doang. Paling formatnya aja rese. Luckily, aku tau cara pake scanf sama printf yang bikin mudah soal ini. AC dalam menit yang sama kayak first solve soal itu di kontes aslinya xD Habis itu, aku lanjut baca soal. Malah baca E dulu. Oh, DP sama faktorisasi doang. DP-nya bisa di-speedup dikit pake kayak sliding window. Coding, terus AC \ :v /

Habis itu liat scoreboard resmi, syok ngeliat udah pada AC 3 :O Jadinya, lanjut ngerjain I yang intinya faktorisasi aja, sama F yang brute force ikutin soal doang. Setelahnya, aku baca soal G, yang Alhamdulillah ada penjelasan samplenya :" Coding kombinasi pake mod inverse, terus AC. Nah, habis itu ngeliat soal B. Oh, 0/1 BFS aja. Bisa pake deque. Ngoding, submit, WA.

Wat. Wat. Wat.

Yakin bener, aku coba assert-assert. Terus nemu kalo ada testcase yang ga ada transportal x( Habis itu, bikin asumsi-asumsi liar, dan akhirnya AC :O Setelahnya, aku baca soal H, dan nyesel ngerjain B dulu, karena soal kayak H itu udah lumayan sering kuliat :( Sisanya tinggal C, D, J. Rasanya udah pernah liat C, tapi D juga keliatan doable. Ngeliat D constraintnya lumayan kecil, aku bikin DP yang kompleksitasnya kayak 200^4, tapi mutusin YOLO aja. Terus AC. Habis gitu, ngerjain soal C, yang proof solusi greedynya ketemu sambil nge-construct solusi. Di menit 117, tinggal soal J \ :v /

Habis itu Xing Xing masuk, dan karena udah waktunya makan siang, kami putusin buat beli makan dulu di KFC terdekat. Kan belinya buat aku, Xing Xing, Ucup, Stacia, Pak Rully. Pas balik, aku baru inget kalo PAK RULLY NGGAK MAKAN AYAM. Terus panik. Tapi yaudah deh, semoga ada jalan. Sampe di Binus, ngajak Stacia sama Ucup makan dulu, habis itu sholat dzuhur. Sesudahnya, liat scoreboard, si Sergio udah leading parah. Aku sendiri males ngerjain soal J karena rada matik, dan firasat harus pake extended euclid, yang diajarin Pak Stef tempo hari tapi nggak kuperhatiin :( Begitu Sergio udah AC 9, yang kulakuin malah "Duh Ser udah Ser jangan AC semua lah". Begitu Sergio AC 10, damn. Yaudah kerjain J. Bikin brute force + math, di submission ketiga AC :O :O :O Total penaltyku lebih dikit dari Sergio yey \ :v / walaupun seandainya aku ikut kompetisi aslinya pasti performaku lebih rendah :P

Setelah itu, kompetisinya selesai, dan peserta udah bisa leha-leha. Meanwhile, aku stres karena Pak Rully ilang dan gak bisa dihubungi. Jadinya ya, sambil nunggu disuruh ngumpul buat pembahasan, penutupan dll, kami ngobrol-ngobrol dulu, sampe akhirnya Pak Rully nelpon, dan kami semua jalan ke tempat yang tadinya dipake pembukaan.

Habis makan siang peserta, agendanya pembahasan-yang-super-singkat-that-i-dont-even-know-if-contestants-will-understand-the-main-idea. Pas sesi pengenalan Binus, sesuai rencana, aku sama Ucup turun buat sholat ashar. Pas balik, ternyata masih sesi pengenalan. Wew. Setelah beberapa lama, akhirnya pengumuman pemenang. Rank-nya udah lumayan predictable sih sebenernya, kalo ngeliat sebelum freeze :/ Nah, terus Sergio dipanggil.

"... Dan champion dari BNPCHS adalah!!!!!"
*Pak Rully berdiri*
"Sergio Vieri!!!"

*dalam hati* "Wah, Sergio jadi tua dan besar"
Terus ketawa-ketawa sama Xing Xing xD

Di sini aku masih sendiri...

Sampai om datang untuk menemani
Congrats untuk para pemenang! Though, sebenernya aku expect lebih dari kalian, terutama medalis OSN dan veteran Pelatnas. Nope, bukannya aku nganggep kalian cupu emang cupu sih , tapi kalo ngeliat performa OSN serta Pelatnas, dan soal-soalnya, harusnya kalian bisa lebih dari ini.

Setelah penutupan, kami lalu cari makan malam. Kayak tahun sebelumnya, hari minggu adalah hari suci "konspirasi menghabiskan uang makan yang jumlahnya gede". Jadi, tujuan utamaku ke BNPCHS bukan ngedummy, tapi cari makan enak. wkwk.

Konspirasi duit makan
Setelahnya, balik ke Polimedia, nonton, ngobrol-ngobrol, tidur.

Paginya, aku beres-beres karena hari itu aku mau balik ke kos. Hari itu juga, si Irvin sampe Indo, walaupun ujung-ujungnya kena macet di jalan. Kalo sparring sebelumnya baik soal maupun OJ-nya dari orang Indo, sekarang soal sama OJ-nya pake punya Singapura. Pas kontes, karena penasaran, aku nyoba-nyoba soalnya juga. Sampe akhirnya males karena ada soal tipe kreatif yang deskripsinya panjang kayak setan x( Tengah kontes, si Irvin dateng. Terus, pas siang-siang, aku, Irvin, Xing Xing makan sate di kantin Fasilkom yang emang enak itu. Siangnya dilanjutin repeating. Sementara Irvin ngurusin Dengklek Contest, aku yang harusnya nyicil pembahasan coderclass, malah ngeretard. Sorenya, adanya penyesalan. Baru inget hari selasa bakal pamitan, yang berarti waktu yang bisa dipake bikin pembahasan berkurang x( Jadinya malam itu pembahasan aku kebut dikit. Nah, pas ngetes solusi, ada dampak gara-gara ngurus soal functional kayak IOI. Seharusnya:

printf("5\n");

Malah jadi:

return 5;

Masih ada kebegoan lainnya, tapi kuskip aja yah :(

Besok paginya, kami lalu cabut ke Kemdikbud di Senayan. Jadi inget pelepasan tahun lalu, mana aku perginya pake batik IOI tahun lalu :') Pas di sana, kayak biasa, ngaret. Untung bawa laptop. Jadinya nyicil coderclass lagi hueue. Habis itu, pas orang-penting-yang-aku-lupa-siapa masuk, beresin laptop, terus mulai acara formalnya. Terus foto-foto.

Go get Golds!
Sumber: Pak Yugo

Extended edition
Sumber: Pak Yugo
Habis foto-foto, agendanya udah lumayan bebas. Terus, malah nyambung ke pembicaraan "apa nama panggilannya Irvin pas masih kecil?". Muncul spekulasi seperti Jojo, Jono, Mojo, Mojo Jojo, dan lainnya. Terus Xing Xing nanya mamanya, dan keliatan puas sekali. Tapi karena dia pelit, nggak dikasih tau ke yang lain.

Setelahnya, ada pembicaraan antar pembina tentang Bebras. Kami juga dengerin. Nah, aku ga sengaja ngeliat pas Xing Xing bales sms mamanya. Jadinya tau nama panggilannya Irvin pas kecil. A very kawaii nickname indeed. Habis itu, balik ke wisma. Nah, kan pesen mobil. HP-nya Xing Xing sinyalnya weak. Jadinya pesen pake HP-ku. Terus begonya, mobil kami beda. Padahal aku mau langsung balik ke kos :""" Untung gap kedatangan kami di Polimedia ga beda-beda banget. Malamnya jadinya fokus ngerjain pembahasan coderclass sampai deket tengah malam. Gamau deadliner lagi deh :'(

Note: kalimat terakhir itu pasti bakal dilanggar.

Di beberapa paragraf sebelumnya, aku ada nyebut Dengklek Contest kan ya? Jadi ini kayak tradisi tahunan sejak 2011, dimana di P4 ada kontes yang isi soalnya mostly ngetroll. Nah, untuk tahun ini, beda formatnya sama tahun lalu. Actually tahun lalu sih yang formatnya beda sendiri. Jadi untuk tahun ini, ada 3 tim, yaitu:

  • Tim Deng, Sergio + Ucup
  • Tim Klek, Stacia + Klungs
  • Tim Guest a.k.a. Asisten, Aku + Xing Xing
Dengklek Contest ini kayak nandain penutupan P4. Which means dilakukan hari Rabu, 10 Agustus. Pagi harinya, aku bangun kayak biasa. Sholat kayak biasa. Mandi kayak biasa. Sampe pas keramas, aku ngerasa ada yang aneh.

*keramas*
*naruh shampoo*
"Perasaan biasanya naruh shampoonya ga di situ deh"
*mikir*
"Dafuq tadi itu sabun cair gobloook"

Udah pertanda ga enak sebelum kontes.

Terus aku pergi ke Fasilkom, dan ternyata bisa sampe lebih dulu, bahkan setelah 10 menit kupake sarapan. Habis briefing Dengklek Contest, kami ke workstation masing-masing. Karena ini ajang seru-seruan, jadinya kami (aku + Xing Xing) ngeretard. Bikin template yang kayak gini. Oiya, aku nulis "nico nico nii" nggak pake googling, jadi kalo salah maapkeun.

Di kontes kami ribut parah :") Dapet non-zero pertama dengan manfaatin apcalc yang kuinstall sebelum P4 mulai :P Habis itu ngerjain soal yang intinya nyari password suatu user. Kejadiannya:

*masukin nama user ke search bar*
*keluar error, usernya ga ada*
"dafuq, ini ngapain kita cari passwordnya kalo usernya aja nggak ada"

Setelah ngespam untuk soal itu akhirnya dapet 100 :") Terus kami balik ke soal pertama kami, dan nyoba oret-oret. Sementara itu, ada yang AC soal yang keliatan serius, dan Alhamdulillah aku dapet solusinya walaupun ngebug retard dulu :P Habis itu kejar-kejaran gila sama tim Deng. Tim Klek? GG WP. In the end, kami menang berkat sampahan di P1 xD Makanya sering-sering nyampah xD

#klungs #uminisasi #niconii
Siangnya, ada sesi sama Pak Sur. Terus naasnya si Ucup sakit. Jadinya dilarikan ke RS dulu, periksa sama minta obat. Sorenya, karena tinggal foto-foto doang, Ucup dikirim balik ke Polimedia duluan, sementara aku balik ke Fasilkom. Habis itu, foto-foto. Oh iya, Sergio dapet coffee maker karena poinnya paling tinggi di P4 ini.

Congrats Ser!
Sumber: Pak Yugo

GoF - {Ucup}
Sumber: Pak Yugo

Apa aku masih cukup muda untuk dianggap GoF? :D
Sumber: Pak Yugo
Sorenya lalu beres-beres kos, dan cabut ke Polimedia. Dikasih puzzle Hanayama sama Irvin, yang puzzlenya lebih di nyusun daripada ngebongkar :( Klungs, Xing Xing, sama Irvin terus main Coup, ditemani aku nyetel "Bohong Bohong Bohong". Sukses ngerusak konsentrasi.

Besok paginya lalu pergi ke Soeta. Terus ngeliat kopernya Irvin yang ajigile gedenya. Pas udah di Soeta, artinya udah mau perpisahan. Aku sebenernya tipe yang bingung kalo acara gitu ngomong apaan. Rasanya ada yang mau diomongin, bingung nyampeinnya gimana.

Jadinya yah, pesan untuk tiap GoF:

  • Sergio: Jangan retard-retard, tetep pertahankan kebiasaan untuk nyampahin tiap soal.
  • Stacia: Jangan terlalu terfokus di satu soal, inget untuk bagi waktu di soal lain.
  • Klungs: Kayak Stacia sih. Oiya, mungkin kamu harus maintain kondisi saat performa optimalmu? :P Walaupun tentunya bahaya kalo kamu sakit di sana. Jaga kesehatan desu.
  • Ucup: Jangan terfokus di satu soal, sama BACA SOAL LEBIH TELITI. Semoga aja nggak masalah karena ada translasi soal untuk tahun ini. Jangan sampe kepisah dari rombongan, kamu kayaknya kalo ilang bisa ditemukan tinggal tulang.
  • Semua: Maintain kondisi yang bagus pas lomba. Secara pribadi, aku sendiri ngerti rasanya under pressure pas kontes (remember i said it took me 1 hour to write sort for scales?) Kalo perlu, beberapa kali ke WC aja. Sama yang udah Irvin tekanin sama aku tulis di atas, jangan lupa nyampah :") last but not least, have fun! Kontes emang penting, tapi jangan lupa bersenang-senang juga :D Mungkin karena game kalian bisa saling unfriend kayak kejadian tahun lalu :P
Welp, rasanya masih ada yang pengen kubilang lagi, tapi sementara ini aja dulu deh :" Semoga pas kontes nanti aku sama Agus bisa bikin commentary di FB yang bagus :D dan semoga ga wacana lol.

Walaupun roleku di sini cuma sebagai asisten sama babu SC , aku pengen berterima kasih sama semua orang yang terlibat di P4 ini, karena tanpa kalian semua, acara ini gak bakal kayak gini :")

Sekian dan sampai nanti lagi! :D

Trivia, in a random order:

  • Jerawat di hidungku yang gede banget itu pecah 2 kali pas P4. Darahnya keluar banyak, to the point i said "Waduh! Pecahkan jerawat, mahasiswa ini dilarikan ke rumah sakit"
  • Dan ketika aku bersihin darahnya pake tissue, Xing Xing kira merah dari darah itu pola di tissuenya...
  • Dapet ilmu kalo soal aneh-aneh itu dapetnya dari ujian matdis.
  • Ada yang tahu arti klungs? Karena ada #klungs di twitter pinoy. Sampai sekarang gak ada yang tahu artinya apa.
  • "Kita harus lebih kuat dari kita yang dulu" -Ayaz, setelah beberapa kali ga bisa buka tutup botol minumnya sendiri.
  • Setelah kejadian 5 gelas, karena aku yang bikin kopi, selalu kupastiin siapa aja yang mau minum.
  • Narik susu ternyata menyenangkan.
  • Orang yang bisa ganti galon tanpa basah itu pasti dewa. Aku sama Xing Xing ganti galon, hanya untuk "mandi".
  • Once i said "Klungs, aku papamu". Ga ada yang berani extend joke itu pas ngomong sama mamanya Klungs.
  • Meng-counter recehnya Irvin, dibuat joke "klungs" dan "oren" secara bertubi-tubi sampai Irvin kesel.
  • Mungkin beberapa sadar, kaos P4 ini mirip P1 2016. Bedanya, ga ada orang kribo di belakangnya. So yea, it's like P1 punya, but cooler.
  • Rei-chan, Rudo Reina, adalah karakter original antara aku dan Xing Xing yang sumber inspirasinya kurang lebih mirip Irwanto antara aku dan Agus.
  • As a side note, aku tahu siapa itu user ReynaldoWijayaH dari TOC Juli :P
  • Kenapa ada #uminisasi ? Karena yah.. reasons.
  • Grup asisten namanya Tukang Makan Pelatnas 4 TOKI 2016 gara-gara aku sering nanyain soal makan :P Terus Prabowo juga ikut nanya makan :P
  • Related to klungs, pas aku ikut nganter ucup ke RS, ada yang nyari klung di FB, dan nemu orang dengan nama Klung Koon Klung :O
  • Ada sendal croc hitam yang ketinggalan di kamarku sama Xing Xing. Kasihan ga ikut ke Kazan >.<
  • Apalagi ya hmm...

Sabtu, 04 Juni 2016

Parallel Binary Search

Kembali lagi ke postingan tentang algo \ :v /
Jadi, kali ini saya mau ngebahas salah satu teknik yang jarang dipake dan mungkin tidak terlalu berguna, namun karena menarik dan lucu (?) jadinya pengen saya bahas :3

Sooo.. dari judul kan bilangnya Parallel Binary Search?  Itu apaan? Binser pake multi-threading? Sebenarnya, nggak ada term yang bener-bener umum dipake untuk strategi ini. Cuma karena kalo di CF biasanya nyebutnya begini, yaudah saya sebut begini juga. Atau enakan binser berjamaah?

Biasanya, teknik ini dipake untuk soal yang di-solve secara offline. Ada kan soal-soal query yang perlu di-solve secara offline kayak pake Mo's Algorithm. Gampangnya, ini Mo's yang O(log N), bukan O(sqrt N). Terus, ketika saya mengatakan binser berjamaah, saya tidak terlalu becanda. Memang, di teknik ini, kita melakukan semua binary search sekaligus. Biar mudah, lihat contoh soal ya. Connecting Graph

Kalo males baca, intinya gini. Ada N vertex dan M operasi, dimana operasinya itu:
  1. Bikin jalan antara u dan v
  2. Nanya kapan vertex u dan v pertama kali terhubung, baik langsung maupun tidak langsung. Jawab sesuai kondisi graf saat ini (bisa aja u dan v kehubung nantinya, tapi kalo sekarang belum, -1).
Ada solusi yang pake sparse table, bahkan kata Anthony bisa O(N log N) secara online. Tapi, biar sesuai dengan post ini, ayo dibahas dengan parallel binary search :3

Jika sudah tau disjoint set, maka solusi O(M log M) per query cukup trivial. Kita bisa binary search jawabannya, dan lakukan penggabungan dalam O(M) menggunakan disjoint set. Kemudian, cek keterhubungan bisa O(1). Cuma, pasti TLE. Bagaimana mengakalinya?

Sebenarnya, apa perlu kita ngelakuin semua itu untuk tiap pertanyaan masing-masing sekali? Apa nggak bisa kita ngelakuin semuanya bersamaan? Jawabannya: Bisa!

Ide utamanya, untuk tiap pertanyaan kita simpen low dan high dari binary searchnya. Kemudian, kita buat O(M) vector untuk menyimpan proses. Jadi, misalnya:
  • Query ke-1 memiliki low = 2, high = 5, mid = 3
  • Query ke-2 memiliki low = 3, high = 10, mid = 6
  • Query ke-3 memiliki low = 3, high = 4, mid = 3
Maka, isi vectornya:
  • vector[3] berisi {1,3}
  • vector[6] berisi {2}
Jadi, tiap isi vector[x] menyatakan query-query yang memiliki nilai mid senilai x. Nah, selanjutnya bagaimana?

Binary search akan berhenti ketika low == high. Itu akan diterapkan di sini. Kurang lebih, algonya:
  1. Cek apakah low == high untuk semua query
  2. Jika iya, berhenti. 
  3. Jika tidak, ke langkah 4
  4. Lakukan loop untuk "mengulang" semua proses update dari awal
  5. Ketika di proses ke-i, cek untuk tiap isi vector[i]
  6. Update low dan high untuk setiap isi vector[i], sekalian masukkan ke tempat barunya jika low < high
  7. Kembali ke langkah 1
Aneh? emang. 

Untuk mempermudah, kita bisa kembali ke soal tadi. Pertama, kita tahu untuk update dan mengecek keterhubungan, kita bisa menggunakan disjoint set. Selanjutnya, kita tinggal mengimplementasikan algo di atas. Contoh solusi:

#include <bits/stdc++.h>
using namespace std;

const int N = 100005;

vector<int> proc[N];
int lo[N], hi[N], pos[N];
int pset[N];
int n,m,ask;

int tipe[N], a[N], b[N];

// inisialisasi disjoint set
void reset() {
  for(int i = 1 ; i <= n ; i++)
    pset[i] = i;
}

// cari root disjoint set
int finds(int x) {
  return x == pset[x] ? x : pset[x] = finds(pset[x]);
}

// menggabungkan disjoint set
void join(int u,int v) {
  u = finds(u); v = finds(v);
  pset[u] = v;
}

// baca input
void read() {
  scanf("%d %d",&n,&m);
  for(int i = 1 ; i <= m ; i++)
    scanf("%d %d %d",tipe + i,a + i,b + i);
}

// jawab-jawabin query
void solve() {
  ask = 0;
  // inisialisasi low dan high
  for(int i = 1 ; i <= m ; i++)
    if(tipe[i] == 2) {
      lo[ask] = 1;
      hi[ask] = i + 1;
      pos[ask] = i;

      proc[(i + 2) / 2].push_back(ask);
      ask++;
    }

  bool change = 1;
  // O(log M)
  while(change) {
    change = 0;
    reset();

    // O(M)
    for(int i = 1 ; i <= m ; i++) {
      // O(1)
      if(tipe[i] == 1) join(a[i],b[i]);

      // proses semua query yang mid-nya sekarang di i
      while(!proc[i].empty()) {
        int posisi = proc[i].back();
        int idx = pos[posisi];
        proc[i].pop_back();

        int u = a[idx];
        int v = b[idx];

        // O(1)
        if(finds(u) == finds(v)) {
          hi[posisi] = i;
        }
        else {
          lo[posisi] = i+1;
        }

        // masih ada yang belum selesai
        if(lo[posisi] < hi[posisi]) {
          proc[(lo[posisi] + hi[posisi]) / 2].push_back(posisi);
          change = 1;
        }
      }
    }
  }

  // output semua jawaban
  for(int i = 0 ; i < ask ; i++) {
    int ret = -1;
    if(lo[i] <= pos[i]) ret = lo[i];
    printf("%d\n",ret);
  } 
}

int main() {
  int t; scanf("%d",&t);
  for(int tc = 1 ; tc <= t ; tc++) {
    read();
    solve();
  }
  return 0;
}

Kompleksitasnya bisa dilihat dari atas. Kita hitung per-update dan query:
  • Update: Ada O(log M) phase, dan tiap phase ada O(M) update yang masing-masing O(1). Total: O(M log M)
  • Query: Ada O(log M) phase, dan tiap phase ada O(M) query yang masing-masing O(1). Total: O(M log M)
  • Totalnya: O(M log M)
Cukup buat AC.

Nah, tapi kalo gitu doang kan kurang berasa. Makanya, kita lanjut ke soal yang bikin saya kenal strategi ini, SPOJ - METEORS

(Males jelasin soalnya, baca sendiri ya)

Jadi, untuk update, kan dibutuhkan range update. Sebenarnya, bisa pakai BIT yang range update point query. Nah, itu juga bisa dibuat pakai segment tree? Nah, kenapa saya sebut segment tree?

Salah satu strategi yang bisa dipakai adalah persistent segment tree. Kalau gak tahu, persistent segment tree itu segment tree yang nyimpen banyak versi selama dia di-update, hanya dengan tambahan O(log N) memory. Total memory yang dia butuhkan adalah O(N log N).

Nah, aplikasinya gimana? Kita bisa bikin dulu persistent segment tree-nya, terus untuk mencari tau pendapatan di suatu waktu bisa O(banyak_sector * log(M)), dengan nge-query di segment tree versi kesekian.

Cuma, katanya solusi ini MLE.
Nah, di sini kita bisa ngeliat "power" dari parallel binary search: Dia bisa ngegantiin persistent segment tree untuk kasus ini! Lebih tepatnya, dari segi memory. Persistent segment tree membutuhkan O(N log N) memory untuk N versi dan data. Sedangkan, dalam menjalankan parallel binary search, yang dibutuhkan hanya O(N) memory!

Jadi, kita bisa menyelesaikan soal METEORS dengan parallel binary search. Update-nya cukup menggunakan BIT, dan query-nya tinggal panggil query di BIT. Analisis kompleksitasnya?
  • Ingat, ada O(log K) phase, karena binary search dimulai dengan low = 1 dan high = k atau k+1 untuk mempermudah
  • Update: Tiap phase, ada O(K) operasi, masing-masing O(log M). Total untuk update: O(K log M log K) 
  • Query: Total, ada M sector yang dihitung nilainya (total dari N state). Untuk satu sector, mengecek nilainya O(log M) karena BIT. Total untuk query: O(M log M log K)
  • Sehingga, totalnya O((M + K) log M log K)
Cukup untuk mendapatkan AC. Saya menyarankan mengerjakan soal ini karena memang bagus. Namun, in case stres, contoh solusi bisa dilihat di sini

Soalnya memang gak banyak, soal yang bisa dipakai latihan:

Connecting Graph (dibahas di post ini)
SPOJ - METEORS (dibahas di post ini)
CF - Sign on Fence

Sekian dulu ya :v

Kamis, 26 Mei 2016

Untitled

Harapan semester ini:
Jadi juri OSN -> unable to go because of a certain fvcked up module.
Magang -> suppose I get internship, there's almost no one free to take care P4 onsite.

Currently I can't even enjoy my life.
What does it mean to be happy anyway?

Rabu, 16 Maret 2016

Pelatnas 2 TOKI 2016

Hai~ :v

Walaupun banyak kerjaan (seperti PR MPKT-A yang tak ada habisnya), saya pengen nge-blog dulu huehue.

Buat yang join olimpinfo, berteman dengan Irvin di FB, atau liat forum TLX, pasti tahu kalau Pelatnas 2 TOKI 2016 baru saja berakhir. Pertama-tama, selamat buat yang lolos :) buat yang tidak, jangan berkecil hati karena perjalanan kalian nggak berhenti di sini juga (kecuali kalo emang udah gak tertarik CP :P ). Anyway, kenapa saya mau nge-blog Pelatnas 2? Padahal saya kan sudah "terlalu tua" untuk ikut Pelatnas? Sebagai peserta, iya. Sebagai panitia? Nggak ada kata "terlalu tua" :3

Yup, selama seminggu, saya diundang untuk ngajar di P2 di ITS. Bagi saya sendiri sih, ini bisa dibilang kayak "hadiah" hasil "kerja rodi" selama 1 semester :') Sebenarnya, ada 3 orang yang diundang untuk ngajar, masing-masing seminggu. Minggu pertama Irvin, minggu kedua dan ketiga tukeran saya dan Agus. Bagaimana jadwal saya dan Agus ditentukan? Solusi sejuta umat: siut. Pas TOKI Camp, kami berdua siut, yang menang yang nentuin. Dan jadinya saya yang datang di minggu kedua :v

Mengingat nggak masuk seminggu, tugas yang bisa dikerjakan saya kerjakan dulu. Masalahnya, walaupun saya berangkat senin, sabtu-minggu saya ada acara Ristek. Jadinya, saya hari minggu sore, sepulang acara ristek, ngebut nugas PSD dan Alin. Sudah gila. Untung selesai. Saya sudah berpikir nyiapin 6 boneka voodoo in case tugas PSD ada revisi seperti biasa. 1 boneka untuk 1 asdos.

Hari senin, saya bangun pagi-pagi lalu cabut ke bandara. Kepagian sih -_- jadinya nunggu lama di bandara. Sesampainya di Surabaya, saya lalu mampir ke Gardena Homestay dulu untuk naruh koper, terus lanjut ke tempat Pelatnas. Sesampainya di sana, ternyata lagi sesi pembahasan. Karena disuruh makan, saya makan dulu. Gila. Makanannya enak. Yakin seminggu di sini bakal lupa rasa mi instan yang biasa dibeli di warkop.

Oh iya, pas saya datang mungkin kesannya kayak ninja. Peserta pada gak sadar. Pas udah selesai makan, dan saya nontonin pembahasan, baru deh peserta sadar kalau saya sudah ada :') btw, saya agak terkejut ngeliat ada Stacia di sini o_o Udah gak perlu belajar buat UN ya mbak? :') Selain itu, ada peserta, Sonny, yang mirip Anthony sehingga kadang saya sebut "Anthony Jr.". Ada juga panitia yang saya baru tau namanya dari Agus beberapa hari yang lalu, Deva. Kenapa saya bisa baru tahu namanya dari Agus? Karena selama di sana, saya, Ari, dan Fendy manggilnya "Rakina". Untuk mempermudah sebut saja Rakina-nya ITS.

Terus, seminggu ini ngapain? Well, kurang lebih sih:
  • Pagi: nontonin anak-anak ngerjain latihan dimana latihannya sering tidak kondusif.
  • Siang: makan, terus bahas soal
  • Siang-Sore: nontonin anak-anak ngerjain latihan + diskusi yang Oh My God tolong jangan seliar ini dek tolong dek tolong
  • Malam: ngerjain tugas sama bikin pembahasan untuk besoknya
Btw, daftar slide yang saya buat bisa diliat di sini
 Oh iya, karena Pak Rully baik, jadinya seminggu ini soal-soal latihan mereka mayoritas soal yang saya test \ :v / Pembahasan yang saya berikan biasanya soal yang tidak ada yang solve. Iyalah, ngapain bahas soal yang udah ada yang solve. Mending mereka yang bahas. Biar gak usah bikin slide juga wkwk :v

Hari selasa pembahasan pertama saya, ngebahas Colorful Tree, soal ternajis yang pernah saya coba. Sebelum pembahasan, saya sudah diwanti-wanti untuk "siap mental". Untungnya, saya sudah biasa dikacangin kalau di rumah :')

 Latihan di hari selasa berjalan biasa saja, walaupun awalnya saya berharap ada satu soal dengan ide keren yang bisa at least salah satu dari mereka solve :' Malam hari Selasa, saya dan Ari diajak Pak Rully untuk makan soto ayam Cak H*r. Oh iya, ini tempat makan yang tahun lalu saya kunjungi pas P2 :') dan sotonya enak :') Pas makan ketemu Yusro dan mbak.. lupa siapa. Maaf ._.v Pas mau netesin jeruk nipis, saya bingung karena lubang di jeruk nipisnya gak jelas. Horor gak sih, kalau pas neken, airnya muncrat ke mata. Moral of the story: Pakai kacamata

Soto Ganja

Hari rabu merupakan hari bersejarah. Ada suatu event yang yah.. hebat ._. Siangnya, saya memberi pembahasan soal hari selasa. Selain itu, siang itu juga saya bahas algoritma Tarjan, walaupun mungkin gak jelas maaf ya ._.v Malamnya, saya main ke tempat teman SMA saya, Oktara. Pas ke tempatnya, saya nyasar dulu selama beberapa menit. Pas tanya nama tempatnya, dan jalan beberapa saat, saya baru sadar kalau itu tempat saya di-drop dari taksi. Kampret tenan. Habis ngobrol-ngobrol, saya balik ke Gardena.

Setelahnya, saya bikin PR Fisika Dasar 2 dengan "bantuan" dari Agus. Besoknya, pas ke ITS, saya lalu scan jawaban PR saya. Ketika mau buka laptop, hebatnya saya lupa baya charger. Untungnya kak Theo baik, mau ngantar ke Gardena buat ngambil charger. Pas balik, saya lalu kirim email tugas ke dosen FisDas 2. Pas agak siang, saya cek email, ada email:

Selamat pagi,

Kayanya kamu lupa attach hasil scan nya ya?

Salam,
-bayu

GOBLOK LUPA NGE-ATTACH PR-NYA

Siangnya, saya bahas soal-soal hari Rabu dengan bantuan kak Eric. Oh iya, ada satu slide yang saya share ke publik. Mahakarya saya. SPOJ - Party! Hari ini juga saya agak kesel karena mereka apa yang saya dan Agus sepakat, "kurang mandiri". Oke, mungkin pas latihan ngejar yang mayoritas lagi kerjain itu mungkin masuk akal. Cuma, kalian yakin itu soal paling ez hari itu? :'(

Malamnya, kembali lagi saya diajak makan sama Pak Rully. Malam itu, saya ke Rawon Setan dan Sate Ondomohen. Pas di tempat sate, saya ketemu Fadel, teman SMA saya, dan bapaknya. Well, jadinya anak-anak angkatan saya yang kuliah di Surabaya mungkin pada tahu kalau saya lagi ke Surabaya :') cuma maaf gak ada waktu buat ketemuan :'( Kalo tahun depan ke Surabaya lagi kuusahain deh :')

Rawon Ganja

Sate Ganja

Hari Jum'at-nya, udah lebih stabil pas latihan. Soalnya emang lebih mudah sih :v Cuma rada kecewa pas soal yang "solusiku magic dan aku tak tahu kenapa itu benar" gak ada yang attempt T_T Bodo amat sih tapi :v Malamnya, saya, dan beberapa asisten diajak makan sama Pak Rully ke Galaxy Mall. Saya makan sushi (yang nunggunya lama bener) dan spaghetti (yang rasanya enak bener). Pas makan, Fendy mau ngegabungin meja, cuma gak dibolehin ibu-ibu di situ. Pas ibu-ibunya gak liat, Fendy sama Ari mo ngegabungin, cuma ibunya keburu noleh. Ari langsung buru-buru balik, tapi Fendy kecantol di meja itu. Sampe kami selesai makan. Maaf ya Fen, aku tertawa di atas penderitaanmu.

Spaghetti Ganja


Pas balik, saya, Fendy, Yusro, dan kak Eric nebeng Ari. Wew, Ari punya Chitato rasa Indomie! Pas lagi otw keluar, Ari lagi ngebacot kayak biasa. Pas lagi ngebacot, ada mbak-mbak lewat.

Ari: *bacot* *bacot* *noleh* "anjir mbaknya cantik"

Gak kaget kalau suatu hari Ari kecelakaan ringan. At least semua tahu penyebabnya.

Pas mo keluar, entah kenapa ada ide gila pengen ngasih mbak kasirnya chitato sebagai pembayaran :v cuma niat ini diurungkan karena rasanya tidak etis wkwk.

Malamnya, pengecekan akhir soal untuk kuis 2. Sekalian kami diskusi soal apa kira-kira yang mereka bakal banyak AC. Well, semoga aja besoknya gak terjadi apa-apa.

Besoknya, kuis 2! Sialnya, di awal ada masalah teknis, beberapa disconnect. Selain itu, ada masalah kecil di deskripsi soal, namun selain itu berjalan lancar-lancar saja. Pas ngeliatin mereka kuis, entah kenapa ada rasa nostalgia gitu. Kangen juga saat-saat duduk di posisi mereka :')

:')

Siangnya, mereka digiring ke tempat penginapan baru. Karena saya gak perlu pindahan, saya jadinya stay di ITS saja, baca-baca komik dan nyicil kerjaan simulasi (walaupun ujung-ujungnya gak jadi ngurus soal yang bersangkutan). Sorenya, Agus datang, dan saya, Agus, dan Pak Rully diskusi sedikit mengenai peserta. Well, buat yang penasaran, bayangin aja gosip ibu-ibu deh :v

Selain itu, Agus bawa berita kampret: Selama saya pergi, PSD dan FisDas 2 kuis. Kampret e pol. Untungya, dia bilang saya datang kuis FisDas atau nggak sama saja. Sama-sama rekt pastinya.



 Sorenya, para peserta balik. Karena mereka akan ngerjain COCI di ITS, jadinya ada waktu santai dari sore sampai jam 9. Disediakan makanan banyak dan film. Sebelum itu, ada juga yang main Avalon, game yang tidak cocok buat saya yang punya trust issue. Sementara saya gak tau mereka ngapain, saya dan Agus main game Tower Defense dari Warcraft III. Pas Agus ngajakin mereka main, kampretnya, ada satu anak, sebut saja D, bilang "game tahun berapa itu kak?". Gila. Kami udah setua itu ya?

Sebelum COCI, saya dan Agus ngomongin dulu beberapa hal ke mereka, kayak hasil observasi saya seminggu ini, sama saran buat saat kontes. Setelah itu, mereka mulai COCI. Asisten juga ikut COCI. COCI-nya kampret parah. Saya benci parsing.

Tengah malam, mereka lalu diantar pulang ke penginapan baru, sementara saya ke Gardena. Agus juga nginep di kamar saya karena disuruh Pak Rully. Saya lalu packing, biar paginya nyantai.

Paginya, saya balik dengan aman terkendali tanpa masalah. Akhirnya kembali ke kehidupan kuliah lagi :'

Well, untuk menutup, saya ingin berterima kasih dengan Pelaksana P2, karena ngundang saya ke ITS, dan memberi akomodasi yang "wah" (saya sudah lupa makan enak sampai tiba di Surabaya). Buat peserta, maaf kalau aku lebih sering gak jelas :') Aku mah emang gitu orangnya :')

Sayonara~

Trivia:
  • Saya kadang nyebut mereka generasi diabetes, karena lebih sering minum nutrisari daripada susu
  • Berhubungan dengan itu, ada peserta yang pernah "makan" instead of "minum" nutrisari. Nak, kamu masih muda. Jangan diabetes dulu
  • Fendy nunjukin narator Avalon pakai google translate. Ngakak parah. Bayangkan:
    "tahan, tahan, tahan, tahan"
    jadi
    "bear, bear, bear, bear"
  • Anak jaman sekarang beda banget suasana Pelatnasnya dibanding 2 tahun aku ikut :'3
  • Mungkin karena gak ada orang sinting kayak Om Ganteng sama objek bully-an kayak Kevin?

Rabu, 02 Maret 2016

Basic Update-Query di Tree

Setelah sekian lama tidak ada aktivitas, akhirnya ada post \ :v / Maafkan saya yang suka menunda-nunda pekerjaan :')

Pada post kali ini, saya mau cerita sedikit tentang menggunakan struktur data di tree. Sesuai judul, basic. Artinya saya gak akan nulis tentang Heavy-Light Decomposition atau Centroid Decomposition atau sejenisnya. Capek soalnya

Apa Yang Kita Butuhkan?

  • Struktur data seperti segment tree atau fenwick tree
  • Teknik mencari lowest common ancestor (LCA)
  • (?) Pre-order numbering
Struktur data seperti segment tree atau fenwick tree sudah banyak pembahasannya, saya sendiri juga pernah sedikit mengulas fenwick tree. Untuk LCA, saya sarankan membaca tutorial Topcoder, biasanya saya menggunakan binary lifting atau gampangnya sparse table. Di blog ini yang akan dibahas Pre-order numbering

Pre-order Numbering 

Pada tree, ada penelusuran yang disebut pre-order traversal. Kita membutuhkan teknik itu untuk memberi "nomor masuk" dan "nomor keluar" setiap node. "nomor masuk" adalah urutan masuk ke node tersebut, sedangkan "nomor keluar" adalah urutan masuk node yang terakhir dikunjungi pada subtree tersebut. Kurang lebih, contohnya adalah seperti ini:
 


Masuk|Keluar

Bagaimana cara membuat array in[] dan out[] ? Kita bisa menggunakan cara seperti potongan code berikut:

int cntr = 0;
int in[MAXN];
int out[MAXN];

void dfs(int now,int prv) {
    in[now] = ++cntr;
    for(int nxt : adj[now]) {
        if(nxt == prv) continue;
        dfs(nxt,now)
    }
    out[now] = cntr;
}
 
Nah, terus apa gunanya penomoran itu? Perhatikan, misal kita representasikan tiap node dengan in[] nya. Apa yang bisa kita simpulkan dari in[] dan out[] ? Yup, tiap rentang [in[a], out[a]] merupakan interval suatu subtree! Biasanya saya sebut "gepengin pohonnya". Karena kita sekarang punya interval, artinya kita bisa menggunakan bantuan struktur data seperti segment tree atau fenwick tree!

Bekerja di Subtree

Tadi kita sudah tahu bahwa dengan bantuan dua array, kita bisa mengubah suatu subtree menjadi suatu interval. Langsung ke contoh soal ya, SPOJ - Palindrome in a Tree

Pertama-tama, kita harus tahu ciri-ciri string yang bisa dijadikan palindrom. Hal yang penting, kita lihat paritas (gak tau istilah benarnya apaan) tiap karakter string itu. Jika yang ganjil = 0, kita pasti bisa buat palindrome. Jika yang ganjil = 1, kita bisa buat yang paritasnya ganjil itu jadi di tengah string, dan selanjutnya kita bisa membuat palindrom.  Selain itu, pasti tidak ada cara.

Jadi, kita cuma perlu tahu paritas tiap karakter dalam satu subtree. Bagaimana caranya? Kita bisa memakai fakta bahwa paritas hanya 0/1, yang bisa kita representasikan menggunakan biner. Artinya, kita bisa membuat bitmask berukuran 26.

Eksekusinya bagaimana? Kita bisa menggunakan point-update untuk mengubah suatu nilai (ingat kita pakai in[] sebagai indeks). Selanjutnya, untuk mengetahui paritas suatu subtree, kita bisa meng-query paritas pada interval subtree tersebut.

Bagaimana cara menggabungkan paritas? Bitmask berukuran 26 bisa direpresentasikan menggunakan int, dan ketika kita menggabungkan, sebenarnya kita melakukan operasi xor.

Contoh solusi:
#include <bits/stdc++.h>
using namespace std;

const int N = 100005;

int BIT[N];
int in[N],ot[N];
vector<int> adj[N];
int sz;
int n,q;
char s[N];

// pre-order numbering
void dfs(int now,int prv) {
 in[now] = ++sz;
 
 for(int nex : adj[now]) {
  if(nex == prv) continue;
  dfs(nex,now);
 }
 
 ot[now] = sz;
}

// update paritas pakai xor
void update(int x,int val) {
 val = 1 << val;
 for(; x <= n ; x += x & -x)
  BIT[x] ^= val;
}

int query(int x) {
 int res = 0;
 while(x) {
  res ^= BIT[x];
  x -= x & -x;
 }
 return res;
}

int main() {
 scanf("%d",&n);
 for(int i = 1 ; i < n ; i++) {
  int u,v;
  scanf("%d %d",&u,&v);
  adj[u].push_back(v);
  adj[v].push_back(u);
 }
 
 dfs(1,0);
 scanf("%s",s);
 for(int i = 1 ; i <= n ; i++)
  update(in[i],s[i - 1] - 'a');
 
 scanf("%d",&q);
 for(int i = 0 ; i < q ; i++) {
  int tipe,x;
  scanf("%d %d",&tipe,&x);
  if(tipe == 1) {
   int res = query(ot[x]) ^ query(in[x] - 1);
   // jika yang ganjil <= 1, maka bisa
   printf("%s\n", __builtin_popcount(res) <= 1 ? "YES" : "NO");
  }
  else {
   char ch[3];
   scanf("%s",ch);
   // pertama-tama, "hapus" kemunculan karakter dulu
   update(in[x],s[x - 1] - 'a');
   s[x - 1] = ch[0];
   // "tambahkan" kemunculan karakter baru
   update(in[x],s[x - 1] - 'a');
  }
 } 
 return 0;
}

Ini hanya salah satu aplikasi pre-order + struktur data untuk menyelesaikan persoalan update-query pada subtree. Terkadang, soalnya bisa saja butuh range-update point-query. Intinya, jika anda sudah lancar melakukan operasi-operasi tersebut pada struktur data, anda tinggal latihan sedikit agar bisa memahami penggunaan in[] dan out[]. Oh iya, terkadang juga, anda butuh lebih dari 1 struktur data untuk menyelesaikannya.

Soal yang bisa dijadikan latihan:
SPOJ - Palindrome in Tree (dibahas pada blog ini)
SPOJ - Snail family problems (Ada 2 kasus untuk update!) 
SPOJ - Rooted Trees (butuh lebih dari satu fenwick tree)
SPOJ - Salary Management (Agak ribet)
Codeforces - On Changing Tree (lebih simple dari Rooted Trees)


Bekerja di Path

Wut? Path? Bukannya cuma bisa pake heavy-light decomposition?

Yang akan saya bahas di sini adalah operasi update dan query, yang memiliki inverse (seperti penjumlahan, xor, perkalian). Trik yang akan saya bahas ini tidak bisa diaplikasikan pada update dan query sepert max dan min.

Saya sebenarnya hampir tidak memiliki contoh soal untuk teknik ini. Teknik ini saya temukan secara tidak sengaja waktu mencoba mengerjakan UVa- Lightning Energy Report. Dulu, ketika Pelatnas, saya mengerjakannya dengan HLD. Namun, ketika nganggur, saya coba mikir apa yang bisa saya lakukan jika ada pertanyaan "berapa nilai node x?" secara online. HLD? Males, ribet. Waktu ngutak-atik, ternyata jika yang ditanya hanya nilai satu node, kita bisa menggunakan fenwick tree saja! 

Bagaimana caranya? Pertama-tama, kita harus tahu cara mengupdate path root -- u untuk tiap node u. Caranya? Ingat bahwa interval [in[v],out[v]] menyatakan interval subtree node v. Seandainya kita ingin mengupdate semua nilai ancestor u dan u itu sendiri, apa yang harus kita lakukan?

Coba update(in[u],value). Observasi apa yang terjadi. Seandainya kita melakukan query(in[v],out[v]) untuk mencari nilai node v, maka node-node yang nilainya terkena efek update(in[u],value) hanyalah ancestor dari u serta u itu sendiri!

Resapi baik-baik paragraf sebelumnya.

Kemudian, bagaimana caranya meng-extend ke path u-v untuk sembarang u dan v? Pertama, jelas kita melakukan update(in[u],value) dan update(in[v],value). Oh tidak, pada LCA(u,v), nilainya ketambah 2 kali. Untuk menghilangkan, lakukan update(in[LCA(u,v)],-value). Tapi, ancestor dari
LCA(u,v) juga masih ketambahan value, padahal mereka harusnya tidak kena update. Yaudah, kita lakukan update(in[parent[ LCA(u,v) ] ], -value).

Contoh solusi:  
#include <bits/stdc++.h>
using namespace std;

const int N = 50005;
const int LOG = 16;

vector<int> adj[N];
int anc[N][LOG];
int depth[N];

int in[N], ot[N];
int sz;

int BIT[N];
int n,q;

void update(int x,int val) {
 // bisa saja terjadi
 // kalau ada pemanggilan update parent[root]
 if(x == 0) return;
 for(; x <= n ; x += x & -x)
  BIT[x] += val;
}

int query(int x) {
 int ret = 0;

 while(x) {
  ret += BIT[x];
  x -= x & -x;
 }

 return ret;
}

int getLCA(int u,int v) {
 if(depth[u] < depth[v]) swap(u,v);
 int diff = depth[u] - depth[v];

 for(int i = 0 ; diff > 0 ; i++)
  if(diff & (1 << i)) {
   u = anc[u][i];
   diff -= (1 << i);
  }

 if(u == v) return u;

 for(int i = LOG - 1 ; i >= 0 ; i--)
  if(depth[u] >= (1 << i) && anc[u][i] != anc[v][i]) {
   u = anc[u][i];
   v = anc[v][i];
  } 

 return anc[u][0]; 
}

void read() {
 scanf("%d",&n);
 for(int i = 1 ; i < n ; i++) {
  int u,v;
  scanf("%d %d",&u,&v);

  // bikin 1-based
  u++; v++;
  adj[u].push_back(v);
  adj[v].push_back(u);
 }
}

void build_table(int now,int par) {
 anc[now][0] = par;
 depth[now] = depth[par] + 1;

 for(int i = 1 ; (1 << i) <= depth[now] ; i++) {
  int papa = anc[now][i - 1];
  int grandpa = anc[papa][i - 1];
  anc[now][i] = grandpa;
 }
}

void dfs(int now,int prv) {
 in[now] = ++sz;

 for(int nex : adj[now]) {
  if(nex == prv) continue;
  build_table(nex,now);
  dfs(nex,now);
 }

 ot[now] = sz;
}

void make_tree() {
 dfs(1,-1);
}

void update(int u,int v,int val) {
 int lca = getLCA(u,v);

 // update u sama v
 update(in[u],val);
 update(in[v],val);

 // hilangin ketambahan 2 kali
 update(in[lca],-val);
 int par = anc[lca][0];
 // hilangin ketambahan
 update(in[par],-val);
}

void solve() {
 scanf("%d",&q);
 for(int i = 0 ; i < q ; i++) {
  int u,v,val;
  scanf("%d %d %d",&u,&v,&val);

  // bikin 1-based
  u++; v++;
  update(u,v,val);
 }

 for(int i = 1 ; i <= n ; i++)
  printf("%d\n",query(ot[i]) - query(in[i] - 1));
}

void reset() {
 for(int i = 1 ; i <= n ; i++) {
  adj[i].clear();
  BIT[i] = 0;
  depth[i] = 0;
 }
 sz = 0;
}


int main() {
 int t; scanf("%d",&t);

 for(int tc = 1 ; tc <= t ; tc++) {
  printf("Case #%d:\n",tc);
  read();
  make_tree();
  solve();
  reset();
 }
 return 0;
}

Seperti saya singgung sebelumnya, aplikasi teknik ini sangat jarang (atau saya kurang banyak latihan). Tapi, keuntungan teknik ini adalah, tidak perlu ribet-ribet bikin HLD (yay!)

Soal yang bisa dipakai latihan:
UVa - Lightning Energy Report (dibahas di blog ini)
SPOJ - Tours (reduce dulu jadi tree dengan menggunakan tarjan untuk mencari bridge)

Sepengalaman saya, teknik yang sering membantu itu yang pertama, yang query subtree. Tapi, tidak ada salahnya kan memperbanyak "senjata" untuk mengalahkan soal? :D

See you next time~ 

Senin, 21 Desember 2015

ACM - ICPC Regional Singapore - Daily Logs(?) Bagian 4

Udah gak kayak daily logs lagi ya ;_; maafkan hue

Day 4 - Excursion

Seperti hari biasa di Singapore, saya hampir telat sholat lagi.
Karena excursionnya jam 9.30, saya leha-leha dulu, download anime sebelum besok dideportasi pulang, cuma nampaknya Tuhan tidak mengizinkan, downloadnya failed. Awalnya saya kira jam 9.30, jadi saya mandi agak lambat. Tiba-tiba kamar saya diketok, disuruh siap-siap. Ternyata perginya 9.15. Untung udah mandi T_T

Setelah ngumpul, kami lalu pergi ke lobby. Ternyata udah ada sejenis briefing, yang ujung-ujungnya gak saya dengerin. Habis itu, kami mobilisasi ke Bus.

Credits : Pak Auzi
Perjalanan ke Sentosa Island gak cukup lama. Pas udah di sejenis parking lotnya, saya yakin beberapa dari kami penasaran kenapa dibawa muter-muter terus. Desain parking lotnya jago. Yang bikin pasti Professional Tower Defence Player.

Setelah itu, kami ngumpul di depan globe gede depannya USS yang biasa jadi background photo orang yang ke USS. Habis foto, Fractal liat Minion gede, terus minta difotoin.

Credits : Pak Auzi
Kera Bondowoso
Habis masuk, kami ke-split jadi 2 rombongan: Pasukan siap mati (Arbit + Fractal), dan yang nyantai-nyantai aja (sisanya). Sementara 2 biji orang itu pergi buat naik Galactica, kami jalan ke arah lainnya. Pertama-tama, kami naik roller coaster yang mungkin paling cupu di antara coaster lainnya di USS. Awalnya, saya bingung kenapa orang yang masuk lebih dulu dari kami selesainya lebih cepat. Masa trek-nya pendek? Ternyata nggak. Wahananya yang cepet. Jahannam. This is why I don't really like roller coaster.

Setelah itu, kami ngelanjutin jalan ke wahana yang ada Puss in the Boots-nya. Di sini kami papasan sama Irvin + Felix. Awalnya, saya pikir wahana ini kalem-kalem aja. Saya sempet becanda "Gus, tuh ada exit siapa tau kamu nyesel". Sialnya, ternyata wahana ini bisa dibilang jahannam juga buat orang kayak kami berdua.

Setelah turun, ternyata Irvin dan Felix belum jalan. Jadinya gabung dengan kami, dan rombongannya tambah gede. Kami lalu jalan ke area Lost World. Di sini, pada mau naik entah namanya apa, yang jelas dibawa tinggi, muterin jalurnya tapi kakinya ngegantung. Karena firasat nggak enak, saya gak ikut. Irvin dan Agus juga. Saya lalu keliling-keliling, niatnya mau ngerekam pas rombongan kami yang naik lewat. Pas saya lagi liat-liat raptor, tau-tau mereka lewat. Kecewa.

Unyu
 Setelah mereka turun, awalnya saya nawarin naik Rapids yang basah-basahan. Tapi ngeliat basah banget, mikirnya jadi naiknya nanti aja. Perjalanan kami lanjutkan ke area Mesir. Di sini, lagi-lagi saya,Agus, dan Irvin tidak ikut naik wahana, karena wahana yang bersangkutan sudah roller coaster, gelap-gelapan, ada warningnya pula di booklet.

while(1) puts("nope");
Pas mereka naik, saya liat-liat Galactica karena trek-nya dekat situ. Pas ada yang lewat, terutama jalur Cylon, saya gak habis pikir kenapa orang naik itu (selera kita berbeda ya). Pas mau balik ke tempatnya Irvin sama Agus, saya ngerasa gerimis. Sial.

Begitu rombongan lengkap lagi, benar saja, langsung hujan deras! Kami lalu berteduh dulu di tempat loker. Setelah itu, saya nawarin buat naik wahana Transformers, karena indoor dan jaraknya cukup dekat. Kami lalu lari-lari ke area Sci-Fi, untuk mendapati waktu nunggunya 1 jam. 1 jam. Tapi yasudah kami naik. Antriannya lama dan panjang, terus di tiap daerah nunggunya ditayangin film yang jelasin wahananya. Sangking lamanya, lama-lama mikir "jangan-jangan wahananya nontonin ini film".
Memang tidak harus kok

Setelah naik, yaa rasanya gitu aja ._. Habis itu kami ke toilet, sekalian minum di tap water. At this moment, saya masih gak beres cara minumnya. Karena masih rada hujan dan udah jam makan siang, kami mutusin buat makan siang. Rombongan kepecah jadi 2, satu yang makan pizza-pizzaan, satunya lagi makan burger-burgeran. Saya ikut makan burger. Pas makan, ngobrol sama Felix, katanya Pak Denny mual gara-gara naik yang Transformers ._. maaf ya Pak ;_;

Habis makan, kami lalu merencanakan perjalanan sambil memperhitungkan hujan. Oiya, tau-tau Arbit + Fractal muncul entah dari mana, gatau kenapa mereka masih hidup. Waktu mereka makan, kami cabut. Wkwk.

Setelah itu kami naik 2 wahana. Pas di jalan, Pak Denny yang udah pulih malah ngomongin bagaimana kejadian hari ini kalau dijadikan soal CP. Kami lalu balik ke area Lost World buat basah-basahan, tapi ternyata tutup karena hujan (padahal basah-basahan juga kan..) Jadinya saya pergi sholat habis itu.

Balik-balik, antrean basah-basahannya udah buka dan PANJANG banget. Kami gak jadi naik. Jadinya kami ke tempat yang ada "donkey" dari Shrek coba ngelawak, tapi kayaknya kami udah terlalu tua buat di situ. Keluar-keluar, sepatunya Felix rusak sebelah. Gaib.

Lagi-lagi, rombongan kepisah lagi. Terbagi jadi yang mau mati naik galactica, dan yang mau nonton Waterworld. Karena masih lapar, saya, Agus, dan Pak Denny makan. Irvin gak makan karena masih kekenyangan (Irvin Agus Anthony gak cerita mendetail apa yang terjadi pas mereka makan siang..)

Jam 4, kami pergi ke Waterworld. I have to admit, pertunjukannya bagus banget :D Balik dari situ, ketemu sama yang ke galactica, dan ternyata wahananya ditutup karena ada masalah :')) Bingung mau ke mana, kami lalu balik ke zona Sci-Fi, naik "apalaj itu intinya cangkir diputer-puter". Sayangnya, ngantrinya lama, dan muternya gak se-ekstrim pas emwe puterin di Kazakh :/

Ada harganya

Uso


Selesai dari situ, kami pisah sama Felix yang mau ke Waterworld. Kami lalu liat-liat souvenir. Saya cuma beli beberapa gantungan kunci untuk orang-orang yang sudah banyak saya repotin selama 1 semester, sama sejenis bantal bentuk pou yang sangat fluffy :3

Kami lalu naik kereta ke VivoCity buat cari makan. Setelah makan, Fractal ngajak ke toko Candy. Di situ, kami berdua beli coklat. Setelah itu, ditawarin Pak Denny buat ke Clarke Quay. Anthony mau ngerjain tugas, sementara saya udah capek. Jadilah kami berdua pulang duluan.

Day 5 - Pulang T_T

Esok paginya, saya beres-beres koper, untuk mendapati secara ajaib barang saya bertambah banyak. Jadinya tas saya berat, dan saya harus bawa-bawa pou itu. Kami lalu makan di NUH untuk terakhir kalinya. Kemudian, Pak Denny ngajak ke Holand Village.

Di Holland Village, kami jalan-jalan sama beli oleh-oleh buat yang belum. Saya sendiri gak beli apa-apa karena bingung bawanya. Omong-omong, kenapa namanya Holland Village kalau gak keliatan orang belandanya? :/

Saya dan Agus lalu balik duluan. Pas nunggu di halte bus, beberapa menit kemudian yang lain nyampai juga di halte. ._. Kami lalu balik ke Sheares Hall, untuk beres-beres dan cabut.

Perjalanan ke Changi berjalan lancar. Sesampainya di sana, dikasih waktu beberapa menit dulu untuk sholat sama ngelakuin hal-hal lain. Pas mau sholat, ternyata mushollanya ada di dalam setelah pemeriksaan. Okay. Karena lapar, saya, Agus, Fractal, Pak Denny beli Subway. Karena tanggung, kami mutusin buat makan setelah masuk saja. Oiya, pas masuk, entah kenapa Fractal dan Anthony selamat tanpa digiring.

Di dalam, kami nanya mbak-mbak informasi tentang Star Wars. Ternyata, tempatnya di luar, sebelum pemeriksaan :')) Jadinya saya, Arbit, Fractal pergi sholat sementara yang lain pergi ke lounge.

Setelah sholat, pas jalan ke lounge, tau-tau dilambai-lambain Pak Denny dari lantai atas. Ternyata ada tempat main PS3. Jadilah kami ngehabisin waktu di tempat itu, main game-game yang game statnya udah gak masuk akal.

Anthony jadi jago main Naruto
 Ketika waktunya tiba, kami lalu pergi ke ruang tunggu. Pas pemeriksaan lagi, tiba-tiba tas saya digeledah. Shampoo saya gak boleh dibawa. Hue.

Perjalanan kembali baik-baik saja. Saya tidur pake pou buat bantal ^_^

Sesudah selesai semua urusan bagasi, kami lalu ngomongin pembagian taksi. Akhirnya kebagi 2 : Yang pulang ke Kutek dan yang lewat Margonda. Saya jelas pulang ke Kutek. Tidur terus di jalan, tau-tau udah nyampai Kutek. Lucunya, Anthony mau ke Fasilkom buat ke Ristek. Kayaknya kos-nya dia udah di Ristek.

Sekian dulu yang bisa saya tulis. Terima kasih untuk penyelenggara ICPC Singapore 2015, I really enjoyed this event :D Terlalu banyak yang perlu diucapin terima kasih, jadi terima kasih semua :D (padahal bingung mau nulis apa)

Oiya :
  • Kecepatan internet di Sheares Hall kurang lebih kayak kecepatan internet di Fasilkom.
  • Di Singapore toiletnya harus pake tissue buat ngebilas. Saya gak mau pake tissue. Di Sheares Hall, shower dan toilet sebelahan. Silahkan simpulkan apa yang terjadi. 
  • Anthony banyak ngomongin tugas, tapi tugasnya juga jadinya.. yahh..
  • Aldi kejepit MRT jadi major event
  • Akibat Aldi kejepit MRT, kastanya langsung paling bawah. "Aldi di mana?" "Aldi jangan di belakang, ntar kejepit" "Aldi mana? Lagi kejepit"
  • ^ Personally i found this amusing, karena kondisi ini berlawanan dengan kelas MPKT-B dimana kasta Aldi paling tinggi
  • Jadi ajang reuni dengan beberapa TOKI 2015 yang gak ikut di Jakarta. Sebut saja mas-mas Jogja dan mas-mas NTU.
  • Sepatu Felix yang rusak, cuma di satu sisi. Sol-nya sampai copot. (namanya sol kan? ._.)
  • "Thon, itu kayaknya enak, minta dong" "Kamu gak boleh makan ini" "Oh."
  • Kelemahan Terharu :') di Math terekspos. Tenang, masih ada banyak kelemahan yang belum terekspos :'))
  • Saya jadi suka duit koin, karena bisa dipake beli di mesin penjual otomatis. Pengecualian buat koin 1$ yang bagus.
  • Pra-kontes, saya pikir saya bisa makan banyak pas kontes. Turns out, cuma makan dikit karena terlalu fokus.
  • Di antara barang-barang yang dikasih panitia, ada peta Singapore. Begonya, Agus baru buka dan ngecek pas mau pulang. 
  • Ada gantungan kunci yang dikasih. Terjadi perdebatan itu sebenernya hewan apa.
  • Saya baca-baca Cheatsheet hasil nyolong kami. Sia-sia, beberapa juga gak ngerti itu algo apaan.
  • Unless we qualify to WF or a certain person failed to transfer, ini kontes terakhir Terharu :') . Maka, mari kita berdoa agar kami lolos atau orang yang bersangkutan gak diterima (jk)