Olimpiešu pieredze
Veidojot šo vietni, šķita interesanti ne tikai apkopot informāciju par dažādām tēmām, bet arī painteresēties, kā olimpiādēs piedalījās iepriekšējo gadu olimpieši. Tā nolūkā tika intervēti un aptaujāti paši olimpieši ar mērķi apkopot rezultātus uz vairākiem jautājumiem. Zemāk var lasīt par rezultātiem un secinājumiem, kā arī apskatīt, ko katrs intervētais un aptaujātais ir atbildējis.
- Cik ilgi un intensīvi nācās nodarboties ar sporta programmēšanu līdz pirmajai medaļai LIO un kādā vecumā izdevās iegūt medaļu? Apkopojot atbildes var secināt, ka iegūtais rezultāts ir proporcionāli atkarīgs no ieguldītā darba. Katra atbilde nedaudz atšķīrās no pārējām, bet vai nu tika pavadīts ne pārāk intensīvs mācīšanās periods, bet ilgs laiks (3-4 gadi), vai arī īsā periodā tika ieguldīts liels darbs gandrīz katru dienu(1-2 gadi), lai iegūtu pirmo medaļu LIO.
- Kāda bija uzdevumu pildīšanas stratēģija jeb kā tika izvēlēti uzdevumi treniņiem? Gandrīzi visiem bija stratēģija pildīt gadījuma uzdevumus dažādās tiešsaistes sistēmās. Tiesa, pieejas mēdz atšķirties. Kamēr vieni vienkārši pildīja šos uzdevumus, citi pievērsa uzmanību tieši tiem uzdevumiem, kurus nespēja aprēķināt, lai uzlabotu savas zināšanas. Tie, kuriem nebija pieejama kvalitatīvu mentoru konstultācijas un lekcijas, vairāk pildīja tiešsaistes uzdevumus un pētīja tiešsaistē pieejamu teoriju, kamēr citi mēdza vairāk paļauties uz mentoru sneigtajiem materiāliem, kas nav slikts variants.
- Vai bez uzdevumu pildīšanas izmantojāt arī kādus teorijas materiālus, lai varētu labāk izpildīt tos? Kādus? Lai gan vairums apgalvo, ka lielākoties tika veikta praktizēšanās uzdevumu pildīšanā, tomēr vairums apgalvoja, ka netiekot galā ar kādu uzdevumu vai dažreiz intereses dzīti pētīja teoriju problēmas atrisināšanai. Tiesa, mērķtiecīga teorijas mācīšanās bez vajadzības laikam pārsvarā notika lekciju laikā. Tika minēti tādi resursi, kā USACO mācību programma http://cerberus.delos.com:790/usacogate, Kormena algoritmu grāmata un dažas citas grāmatas.
- Kā notiek gatavošanās pirms olimpiādes? Visi pamatā intensīvi pilda uzdevumus pirms olimpiādēm, lai labāk to varētu darīt olimpiāžu laikā, bet atšķirībā no parastajiem treniņiem vairums atkārtoja teoriju dažādos veidos - ar mentoru palīdzību, teorijas grāmatām, iepriekš atrisinātiem uzdevumiem.
- Vai pirms olimpiādes notiek teoriju atkārtošana, lasīšana vai drīzāk daudzu uzdevumu pildīšana prasmju slīpēšanai. Abas divas lietas tiek darītas paralēli, lai gan praktizēšanās notiek vairāk kā teorijas pētīšana.
- LIO parasti notiek divas dienas. Vai pirms un starp šīm dienām notiek materiālu atkārtošana un uzdevumu pildīšana vai drīzāk atpūšanās un noskaņošanās katrai dienai? Visi teica, ka labāk ir nemācīties un atpūsties starp olimpiāžu dienām. Normunds piebilda, ka dažreiz mēdza atkārtot kādas grūtākas formulas, bet nedarīja neko nopietnu.
- Kā izvēlaties uzdevumu pildīšanas secību? Visi kā viens teica, ka mēdz ņemt pirmo uzdevumu, kuru spēj atrisināt un to atrisina. Bet Eduards atzina, ka stratēģiski tas nav labākais variants, jo var tikt palaists garām kāds vērtīgs uzdevums. Viņaprāt cilvēkiem ar mazāku pieredzi vajadzētu izlasīt visus uzdevumus un censties izvēlēties vieglākos uzdevumus.
- Ko darat situācijās, kad kādu no uzdevumiem nevarat atrisināt? Izmantojat rupjā spēka metodes vai nepildat vispār? Vairākums teica, ka, nespējot atrisināt uzdevumu, tie pārslēdzas uz citu, bet, ja nav vairs 100% optimāli risināmu uzdevumu, tad ķeras pie plāna B - domā jaunu risinājumu vai risina kādu testu apakškopu vai apakšproblēmu, kas ir atkarīgs no tā, vai zudevumā ir dotsi apakštesti.
- Kāda ir uzdevumu testēšanas stratēģija? Cik daudz laika tam tiek atvēlēts? Cik daudz testus parasti jūs rakstāt? Visi uzsver, ka testēšana ir otršķirīga, bet tā ir nepieciešama. Tiek domtāts par stūra un robežu gadījumiem, bet bez tā gandrīz visi teica, ka dažreiz ir rakstījuši vienkāršākas rupjā spēka metodes, lai fonā testētu uzdevumus. Apsverot testēšanu ir jāņem vērā, vai pietiks laika citiem uzdevumiem un vai testēšana ir tā vērta.
- Ja ir palicis ļoti maz laika, kādas ir stratēģijas uzdevumu pildīšanai? Ja vien nav kāds iesākts uzdevums, kuru cenšas pabeigt pēdējās sekundēs, tad pārsvarā visi cenšas notestēt risinājumus, lai nezaudētu jau tos punktus, ar kuriem rēķinās un uzlabotu risinājumus.
- Cik liela loma sacensību laikā ir pierakstīšanai un zīmēšanai? Cik liela loma tam ir ārpus nodarbībām? Visi kā viens saka, ka zīmēšana ir ļoti svarīga, katrs uzdevums, ja nav pavisam triviāls, tad ir jāuzzīmē uz papīra vai jāapraksta tā formulas. Zīmēšana palīdz saprast, kā problēma strādā un labs zīmējums var viegli novest pie problēmas risinājuma.
- Vai pirms BOI, vai IOI notiek pastiprināta intensīva uzdevumu pildīšana? Dažas nedēļas pirms IOI, BOI noteik ļoti intensīva gatavošanās. Pirms IOI rīdzenieki, kas ir atlasē, piedalās Sergeja Meļņika rīkotās intensīvās nodarbībās. Dažas dienas pirms olimpiādes - relaksācija.
- Ja būtu jāsadala teorijas dažās lielās nodaļās, kādas tās varētu būt? Šķiet, ka IOI tēmu saraksts (syllabus) aptver visas tēmas, kuras pieminēja aptaujātie.
- Nosauciet tiešsaites sistēmas, kurās jūs gatavojāties LIO un citām sacensībām. Projektu nosaukumi, kurus var atrast googlē - TopCoder, SPOJ, Olimps, USACO, COCI, CodeChef, Codeforces, http://clist.by/, UVa, ProjectEuler, CodeJam.
- Kaut kas vēl, ko pastāstīt par uzdevumu pildīšanas stratēģiju olimpiāžu laikā un trennēšanos ārpus tām? Kopsavilkums no intervijas ar Eduardu Kaļiņičenko: LIO ir Latvijas līmeņa olimpiāde un ir labi, ka cilvēki var iegūt normālus punktus šīs olimpiādes ietvarā, bet, piedaloties Atlasē, ir jāņem vērā, ka Atlase notiek priekš IOI, BOI olimpiādēm, kas ir internacionāla līmeņa sacensības, tādēļ ir nepieciešams jau Atlasē atlasīt šāda līmeņa kandidātus, kas parāda, ka skolniekiem ir jāsagatavojas vairāk kā vidusskolas līmenī, lai tuktu pāri Atlasei. Matemātikas apgūšana palīdz sporta programmēšanai, bet sporta programmēšana tajā pašā laikā palīdz matemātikas apguvei. Tādēļ var iet vienu ceļu un tiks ieguldīts jau otra virziena attīstībā. No Normunda Vilciņa aptaujas: Praksē ir pierādījies tas, ka olimpiādēs (it īpaši augstāka līmeņ) 'nekas nav jāzin'. Protams, ir jāzin pamatlietas, kas ir DP, kas ir BFS, un tml. Bet galvenais ir praktiskāpieredze ar daudz dažādiemu zdevumiem. Pietiek zināt galvenos konceptus. Dziļas un specifiskas teorijas zināšanas, kā arī zināšanas par specifisku uzdevumu risināšanas detaļām, neko nedos. Ja olimpiāde ir kvalitatīva, tad uzdevumi būs oriģināli, un visu izšķirs spēja izdomāt risinājumu. Un tipiskā gadījumā (90+%) uzdevumu atrisinājumi balstās uz ļoti vienkāršām idejām un pamatalgoritmiem. Tā kā ieteikums būtu - protams, nevajag apstāties un vajag apgūt jaunas tēmas un paņēmienus, bet nevajag skriet pārāk ātri, vajag daudz risināt uzdevumus. Kā arī piebilde - dinamiskā programmēšana un grafi ir ļoti ļoti spēcīgi ieroči. No Ērika Gopaka aptaujas: Vēl kaut kas? Nu, labi. Svarīgākais, manuprāt, ir motivācija. Ja ir motivācija, tad gan teoriju iemācīsies, gan arī regulāri piedalīsies visādos turnīros. Bet motivācija rodas no apziņas. Kāpēc skolēnam vispār vajag kaut kur piedalīties? Kāpēc vispār kaut ko mācīties? Var būt labāk pamācīties bioloģiju, nevis algoritmus? Vai tas noderēs dzīvē? Visādas tādas domas rodas tieši vidusskolā un pārsvarā paliek neatbildētas. Es atceros, ka biju stipri "vīlies", kad uzzināju, ka par medaļām IOI (vai laikam arī BOI?) dod naudas balvas! Šausmas... kas nu motivē labāk par naudu? Manuprāt, par šo jāzina visiem olimpiešiem vēl pirms viņi piedalās valsts (III) kārtā. Es gan biju nožēlojis, ka neuzzināju šo niansi vismaz 11. klasē. Kaut arī cits varētu apstrīdēt, ka motivācijai vajadzētu būt kaut drusku "morālākai"... Tam ir grūti piekrist, jo nauda ir objektīvi labs motivators :DDD No Mārtiņa Frolova aptaujas: Bez komentāriem :)
Apkopojums no intervijas ar Eduardu Kaļiņičenko
- jautājums. Progmeistarā sāka mācīties no aptuveni 4. klases. Pirmo reizi piedalījās sacensībās 2007. gadā (8. klasē) un ieguva bronzas medaļu. Mācīšanās vairāk notika Progmeistara ietvaros, bet papildus tika arī pildīti uzdevumi un šis tas lasīts.
- jautājums. Bija regulāras tematiskas nodarbības Progmeistarā, kuru ietvarā tika arī pildīti dotie uzdevumi pēc mācību plāna. Neuzskata, ka uzdevumu bezmērķīga pildīšana uz riņķi ir laba ideja. Labāk, ja ir pārdomāta sistēma, pēc kuras mācīties, kas aptver nepieciešamo. Tādēļ treneri ir svarīga treniņu daļa, lai apgūtu programmēšanu. Mācīšanās labāk notiek, ja tas tiek darīts pa tematiem un katrs uzdevums ir specifisks ar kādu knifu.
- jautājums. Analizēja neatrisinātos uzdevumus, pētīja to risinājumus. Pasniedzējs Sergejs Meļņiks sagatavoja mācību plānu un tika apgūtas plānā esošās tēmas. Teorija parasti tiek apgūta papildus risinot ar tēmu saistītus uzdevumus.
- jautājums. Pamatā gatavošanās notika Progmeistara izlases nodarbībās un tiešsaistes sacensībās.
- jautājums. Nedēļas laikā pirms olimpiādes nenotiek nekāda īpaša trenēšana – Eduards uzskata kā daudz vērtīgāk ir ļaut sev atpūsties. Mēģināt iekrāmēt galvā visu pēc kārtas dažas dienas pirms olimpiādes nav tik vērtīgi, jo daudz svarīgāk ir saprast algoritmus, nevis iegaumēt tos – un darīt to dažas dienas pirms ir jau par vēlu.
- jautājums. Eduards mēģina atslēgties no iepriekšējās dienas sacensībām un aizmirst par visām pieļautajām kļūdām, jo tas nepalīdzēs nākamajā dienā. Nav arī vērts vairs neko nakti iepriekš mācīties vai analizēt. Vēlāk būs laika par to domāt, bet tajā vakarā vajag atpūsties.
- jautājums. 11. - 12. klasē sāka nelasīt visus uzdevumus no sākuma, bet izlasot kādu, tas tika padomāts un, ja to var atrisināt, tad risināja, citādi ņēma nākamo. Eduards saka, ka šai pieejai ir liels mīnuss, ka var palaist garām kādu vieglāku uzdevumu, jo grūtības secība nav zināma, un var patērēt pārāk daudz laika uz vienu uzdevumu. Pareizāk būtu no sākuma pārlasīt visus uzdevumus, ja vien nav liela pieredze.
- jautājums. Ja ir testu grupas, tad pilda to testu grupu, kuru var atrisināt, citādi raksta labāko izdomājamo risinājumu.
- jautājums. Nepatīk, ka testēšanas nozīme ir samazināta, tādēļ testēšanu veic minimāli. Pārbauda stūra gadījumus, bet parasti vairāk nav nepieciešams testēt. Bet, kad nevar redzēt pilnus rezultātus sacensību laikā, ir izvēle starp to, vai pildīt nākamo uzdevumu, kuru var atrisināt, vai testēt uzdevumu un atrast kādu kļūdu. Apakštestu kopas parasti sniedz daudz informāciju par nepieciešamajiem testiem. Eduards trenējās, piemēram, TopCoder, lai palielinātu iespējamību, ka kods ar pirmo tiek uzrakstīts pareizs un stūra gadījumi tiktu pārdomāti rakstīšanas laikā. Uzskata, ka pēdējā laikā sacensības pārvēršas tādā formātā, ka tiek uzrakstīts risinājums, iesūtīts un tad tikai tiek domāts, vai tas ir pareizs. Dažreiz mēdz rakstīt testu ģeneratoru un rupjā spēka risinājumu, lai palaistu fonā un varbūt noķertu kādu problēmu. Domā, ka iesācējiem var būt ļoti lietderīgi testēt savu kodu treniņos, jo tas palīdz izprast kodu, problēmu un speciālos gadījumus, bet ar laiku kļūdu skaits vidēji samazinās.
- jautājums. Ja vien neko uzreiz nevar paspēt, tad drīzāk pārbaudīt risinājumus, lai pārliecinātos, ka netiks zaudēti kādi punkti.
- jautājums. Ir svarīgi zīmēt risinot uzdevumus, jo tad var vieglāk saprast problēmu un risinājumu. Eduarda prāt labs piemērs ir dinamiskā programmēšana, kur var aprakstīt uz papīra masīvu, katru tā dimensiju, pārdomāt ciklus un uzrakstīt formulas, lai vieglāk būtu pārdomāt, vai tas strādā. Vēl viena rekomendācija ir uzrakstīt ierobežojumus un svarīgas nianses uz papīra, jo kļūdoties ar ierobežojumiem var izmantot nepareizu algoritmu vai, piemēram, nepareizus masīvu izmērus.
- jautājums. Tika rakstītas tiešsaistē pieejmās sacensības. Starp LIO un BOI nav pārāk liels laika intervāls, kā arī ir visu laiku ir skola, tādēļ nekas daudz nemainījās. Pirms IOI notika izlases treniņi un IOI notika vasarā, tādēļ trenēšanās notika intensīvāk - 30 darba dienās katru pirmdienu un sestdienu no 13:00 - 20:00 vidēji līdz nedēļai pirms sacensībām.
- jautājums. Šķiet, ka IOI syllabus aptver visas tēmas.
- jautājums. - COCI olimpiāde (tā kā citas tiešsaistes olimpiādes mēdz būt samērā īsas, tad 3 stundas mēdz būt labs kompromiss sacensībām).
- Codeforces ir regulāras un labas 2 stundu garas sacensības. Parasti ir uzdevumu analīze pēc sacensībām, kā arī vērtīgi komentāri. - TopCoder nav rekomendējama iesācējiem, jo notiek ļoti īsā laikā un jāprogrammē ir ļoti ātri, kā arī uzdevumu sarežģītībai mēdz netikt pievērsta liela uzmanība, kas ļauj rakstīt rupjā spēka algoritmus. TopCoder var atrast labus cilvēku rakstītus resursus. - Var meklēt 5 stundu reģionālas sacensības, lai trenētu izturību. Var atrast piemērus šeit: http://clist.by/ - UVa - satur daudz labas problēmas un ir liels arhīvs ar uzdevumiem. 1. jautājums. LIO ir Latvijas līmeņa olimpiāde un ir labi, ka cilvēki var iegūt normālus punktus šīs olimpiādes ietvarā, bet, piedaloties Atlasē, ir jāņem vērā, ka Atlase notiek priekš IOI, BOI olimpiādēm, kas ir internacionāla līmeņa sacensības, tādēļ ir nepieciešams jau Atlasē atlasīt šāda līmeņa kandidātus, kas parāda, ka skolniekiem ir jāsagatavojas vairāk kā vidusskolas līmenī, lai tuktu pāri Atlasei. Matemātikas apgūšana palīdz sporta programmēšanai, bet sporta programmēšana tajā pašā laikā palīdz matemātikas apguvei. Tādēļ var iet vienu ceļu un tiks ieguldīts jau otra virziena attīstībā.
Normunda Vilciņa aptauja
- jautājums. Es teiktu kāds pusotrs gads. Par sporta programmēšanu uzzināju neilgi pēc tam, kad sāku skolā nopietni apgūt programmēšanu, līdz ar to tehniskās zināšanas apuvu regulārās nodarbībās skolā, un uzdevumus risināju pats, mājās. Cik intensīvi, grūti pateikt, bet vidēji kādus pāris uzdevumus nedēļā.
- jautājums. Sākotnēji nekādi kritēriji netika izvirzīti, tikai risināju vieglos uzdevumus uzdevumu krājumā ( http://olimps.lio.lv/ ), kā arī šo to vairāk matemātisku, bet ar programmēšanas piesitienu, no ( http://projecteuler.net/ ). Vēlāk (kādu 1 gadu pēc sākšanas) pievērsos dažādām online sacensībām, kas tobrīd bija pieejamas (piemēram, TopCoder), kā arī sāku darīt USACO speciāli sagatavoto treniņu programmu, kas jau bija nedaudz strukturētāka pieeja treniņam ar visu teorijas apmācību.
- jautājums. Jā, bet ļoti maz. Jau iepriekš minētā USACO treniņu programma, kur ir teorijas izklāsts, manuprāt bija galvenais. Šad tad palasīju wikipedia rakstus, vai vienkārši google, kad bija kāda interesējoša tēma (pārsvarā pētīju grafus un grafu algoritmus). Un, protams, neizbēgami saskāros ar teoriju pēc dažādām sacensībām, kad lasīju risinājumu izklāstus. Bet teorijas apguve noteikti sastādīja daudz mazāku daļu nekā prakse. Vēl varbūt jāpiebilst, ka tajā laikā nodarbojos arī ar matemātiku, līdz ar to nebija problēmas ar aritmētiku un tml. lietām.
- jautājums. Daudz risināt uzdevumus un programmēt atrisinājumus. Palīdz, ja kāds pieredzējušāks var pateikt, kādus uzdevumus labāk izvēlēties, bet pa lielam galvenais ir risināt daudz pašam. Uzdevumi olimpiādēs parasti prasa vairāk izdomu, nekā specifiskas zināšanas par teoriju, kā arī no programmēšanas (valodas) zināšanām tur nepieciešami tikai paši pamati. Vēl, protams, nepieciešams spēt ātri uzprogrammēt strādājošu risinājumu, kas arī nāk tikai no prakses.
- jautājums. Principā tas,kas 4. atbildē. Vēl piebildīšu, ka man personīgi tieši pirms pašas olimpiādēs (tā kā iepriekšējā dienā vai vakarā) palasīt citu gadu olimpiāžu uzdevumu risinājumus teksta veidā, ar domu, ka dažādas pamatidejas 'nosēžās galvā' (it īpaši labi parasti ir sagatavoti BOI un IOI bukleti). Es gan nezinu, vai tas tiešām strādāja, vai beigās bija tīri izklaides nolūkos.
- jautājums. Ja ir notikusi intensīva prakse, gatavojoties olimpiādei, tad kādas 2-3 dienas pirms noteikti jāņem pauze. Ir tas 5. punktā minētais risinājumu pārskats, kā arī dažkārt atkārtoju kaut kādas formulas vai tml., ko grūti iegaumēt (piemēram, ģeometrijas pamat formulas). Bet tas minimāli, lai neaizmirstu svarīgas lietas un lai atsvaidzinātu prātu, bet noteikti ne kaut ko nopietni risināt.
- jautājums. Neesmu nekad īpaši pie tā piedomājis. Sākumā mērķis ir atrisināt pilnībā kādu uzdevumu, tāpēc nesteidzos ar daļējiem risinājumiem, līdz ar to pat, ja ir idejas kādā uzdevumā, bet ne risinājums līdz galam, varu pāriet uz citu uzdevumu. Dažreiz ir tā, ka var just, ka uzdevums ir risināms, tikai drusku jāiegulda laiks (piemēram, ideja skaidra, tikai jāpastrādā, lai atrastu nepieciešamās skaitļošanas formulas - tādu uzdevumu neatlieku, ķeros uzreiz klāt)
- jautājums. Ja ir citi uzdevumi, tad atstāju uz vēlāku laiku. Ja nav (vai arī citos ir tāds pats strupceļš), rakstu suboptimālu risinājumu. (Gandrīz) nekad nerakstu ne-100%-pareizus risinājumus, rakstu tikai tad, ja ir pareizs, bet lēns. Rupjais spēks rezultātā dod daļējus punktus un risinājumu maziem testiem, ko izmantot kādas citas idejas pareizības parbaudei. Bet principā ar suboptimāliem risinājumiem nesteidzos, jo tie arī prasa laiku, ko labāk izmantot domājot par ko labāku, it īpaši, ja olimpiāde tikko sākusies.
- jautājums. Atkarīgs no sacensību specifikas. Ja ir feedback, tad ar testēšanu neaizraujos. Pārbaudu uz dotajiem piemēriem, varbūt vēl kādu mazu piemēru, ko jau esmu ieskicējis, domājot par risinājumiem, kā arī minimālos testus (lai izķertu corner case kļūdas) un max testu (pārbauda corner case, overflow, masīvu robežas, laika limitu). Ja nav feedback, tad savadu pāris testus, kurus varu atrisināt uz papīra, kā arī dažreiz, ja ir salīdzinoši viegli, uzrakstu brute force, pārlasu daudzus mazus testus, unsalīdzinu rezultātus. Laika ziņā varbūt 5% no kopējā risināšanas laika.
- jautājums. Brute force maziem testiem + kaut kas viegli uzrakstāms bet ne vienmēr pareizs lieliem testiem. Var arī mēģināt optimizēt brute force daļu, lai strādā vēl ātrāk. Tas gan attiecas tikai uz sacensībām ar parciālpunktiem (olimpiādes tādas ir). Ja der tikai 100% pareizs un ātrs risinājums (TopCoder, ACM, ..), tad nekas cits neatliek, kā domāt. Varbūt brute force var izmantot rezultātu pētīšanai, bet to daru ļoti reti.
- jautājums. Ļoti liela. Daudzus uzdevumus vieglāk saprast, ja to svizualizē. Grafu uzdevumi, uzdevumi uz rūtiņu režģa, ģeometrijas uzdevumi viennozīmīgi. Bet arī citos. Kaut vai lai saprastu, kā savā starpā mijiedarbojas kaut kādas vērtības un tml. Formulu izvedumus arī vajag darīt uz papīra. Palīdz arī uz papīra sarakstīt formulas un varbūt pat aptuvenu pseidokodu, pirms ķerties pie kodēšanas, pat, ja uzdevums ir itkā viegls un var arī izdomāt sīkumus programmēšānas gaitā - tas beigās prasīs vairāk laika un lielāka iespēja kļūdīties; pirms 'sēssties pie datora', visam jābūt 100% skaidram.
- jautājums. Jā. It īpaši pirms IOI. Pirms IOI abas reizes pa vasaru apmeklēju Sergeja Meļņika treniņus (katru dienu, visu dienu). Pirms BOI arī pastiprināti, bet mājās paša spēkiem. Regulārus, intensīvus, organizētus treniņus ar teorjiu betļoti daudz prakses gan nekas nevar aizvietot.
- jautājums. Aritmētika un skaitļu teorija, Pamatstruktūras, Grafi, Dinamiskā programmēšana, Rekursija, Binārā meklēšana (un saistītas idejas ar šķelšanu uz pusēm, piem., quick sort), Ģeometrijas, Segmentu koks un draugi (sweep line algoritms)
- jautājums. Olimps, TopCoder, USACO, ProjectEuler, Horvātu atvērtā olimpiāde, CodeJam, tagad Codeforces ir ļoti labs arī.
- jautājums. Praksē ir pierādījies tas, ka olimpiādēs (it īpaši augstāka līmeņ) 'nekas nav jāzin'. Protams, ir jāzin pamatlietas, kas ir DP, kas ir BFS, un tml. Bet galvenais ir praktiskāpieredze ar daudz dažādiemu zdevumiem. Pietiek zināt galvenos konceptus. Dziļas un specifiskas teorijas zināšanas, kā arī zināšanas par specifisku uzdevumu risināšanas detaļām, neko nedos. Ja olimpiāde ir kvalitatīva, tad uzdevumi būs oriģināli, un visu izšķirs spēja izdomāt risinājumu. Un tipiskā gadījumā (90+%) uzdevumu atrisinājumi balstās uz ļoti vienkāršām idejām un pamatalgoritmiem. Tā kā ieteikums būtu - protams, nevajag apstāties un vajag apgūt jaunas tēmas un paņēmienus, bet nevajag skriet pārāk ātri, vajag daudz risināt uzdevumus. Kā arī piebilde - dinamiskā programmēšana un grafi ir ļoti ļoti spēcīgi ieroči.
Ērika Gopaka aptauja
- jautājums. Intensīvi noteikti neesmu gatavojies (pirms LIO medaļas), bet esmu ieguvis tikai vienu vienīgo, 12.-ajā klasē (bronza). Laikam tad es biju ap 19 gadu vecs.
- jautājums. Ņēmu uzdevumus no Olimps servera. Tad biju sastapies ar TopCoder, USACO un var būt kaut ko citu.
- jautājums. Visproduktīvāk sāku trenēties pēc 11. klases, kad mans skolotājs iedeva man vairākas grāmatas par algoritmiem. Tolaik es vēl nebiju nopratis, ka tās zināšanas labi noderēs dzīvē)) Precīzi jau neatceros nosaukumus, bet dažas no tām gan bija kaut kādas klasiskās algoritmu grāmatas, tulkotas krievu valodā. Vismaz viena bija par datu struktūrām. Laikam nebija tās visas izlasījis, vai arī tēmas tajās pārklājās savā starpā.
- jautājums. Ideālā gadījumā tieši pirms olimpiādes (1-2 dienas iepriekš) cenšos nedarīt vispār neko, kas būtu saistīts ar olimpiādi. Vismaz mana pieredze pārliecināja mani, ka ir spēkā paradokss: jo mazāk es gatavojos pirms olimpiādes (vai eksāmena, vai cita veida sacensībām), jo labāk man iet :) Var būt tas tā ir daudziem, jo psiholoģiski rodas problēmas, ja pirms sacensībām sāc asi sajust, ka tu daudz ko vēl neesi paspējis iemācīties, tāpēc sāc uztraukties...
- Jautājums. Skat. iepriekšējo atbildi. Bet jā, praktiski esmu mēģinājis atkārtot, jo (1.) nebija ko citu darīt autobusā, braucot, piemēram, uz Rēzekni, un (2.) tomēr gribējās atgriezties mājās ar jaunām zināšanām :D
- jautājums. Līdzīgi, ka 4. jautājumā, domāju, ka nevajadzētu atkārtot, ja ir vēlme pataupīt spēkus un parādīt sevi uz visiem 100%. Domāju, ka krietni labāk būtu aiziet apskatīties kaut kādu filmu, vai vēl labāk - parunāt ar draugiem, vai iepazīties ar jauniem :)
- jautājums. Hmm, olimpiādēs mēdza būt tikai 3 uzdevumi. Man parasti nebija pa spēkiem 3, vai arī kāds cits, kur bija ģeometrija, vai grafu teorija. Skolas laikā man bija pamaz iemaņu šādu uzdevumu risināšanā. Risināju visu (ko varēju) pēc kārtas. Ņemot vērā, ka nekādi "penalty" par patērēto laiku netiek piemēroti, izskatās, ka secība nav ļoti būtiska.
- jautājums. Hmm, labs jautājums! :) Laikam situācijās, kad nezinu 100% risinājumu (t.i. tādu, kas varētu būt spējīgs dabūt max punktus), mēģinu skatīties parējos uzdevumus. Ja arī starp tiem tādu neatrodu, tad izdomāju kaut ko "plānam B" (t.i., ko darīšu, ja neko jaunu vairs neizdomāšu), un tad nopietni piesēžos pie kāda no uzdevumiem, mēģinu izgudrot risinājumu...
- jautājums. Stratēģija ir izmantot sample testu (ja ir vairāki, tad ar "sakarīgāku" no tiem). Kamēr neuzrakstīšu risinājumu, tad arī nebūs ko testēt :) Tāpēc testēju pārsvarā pēc uzrakstīšanas. Ja mēs runājam konkrēti par LIO, tad (vismaz manos laikos) testu rezultāti bija zināmi vienīgi par sample testiem, tāpēc testēšanai bija liela nozīme. It īpaši uz MAX-testiem (pārbauda TL un arī visādus iespējamus stack vai int overflow...). ACM-ICPC gadījumā bieži noder mēģināt uzreiz nosūtīt tikko pabeigto risinājumu bez kārtīgās testēšanas, jo par visu testu veiksmīgu iziešanu uzzināsi uzreiz.
- jautājums. Cik sevi atceros, laiks parasti beidzas tad, kad mēģinu pabeigt rakstīt kādu no uzdevumiem. Nu ko, tad cenšos vēl labāk sakoncentrēties un rakstīt ātrāk un/vai īsāk, iespējams mazāk (vai vispār ne-) testējot. Gadījumos, ja nekas rakstāms
- jautājums. Kā arī matemātikas olimpiādēs (pārsvarā runājot par ģeometrijas uzdevumu risinājumiem) - labs zīmējums jau ir puse no risinājuma :) Ja paveicas ar normālu zīmējumu, tad ar to palīdzību gan būs viegli izdomāt adekvāto algoritmu, gan tā pareizdarbības pamatojumu, gan arī būs vieglāk uzprogrammēt. Es vienmēr par labām bildēm) Tas ir būtiski ļoti daudzās sfērās, it īpaši saprašanai-kritiskajās aktivitātēs (tai skaitā reklāmās, prezentācijās, etc.)
- jautājums. Jāaa, 12. klasē, kad uzzināju, ka tieku Latvijas IOI izlasē, uzreiz arī uzzināju, ka būs jānāk uz nodarbībām pie Sergeja Meļņika. Nekad agrāk pie viņa nebiju neko mācījies, bet biju dzirdējis, ka viņš esot labs un prasīgs.
- jautājums. Divās nodaļās: teorija, kuru es zinu, un teorija, kuru nezinu :D Neko jaunu es te neuzrakstīšu: nu ir grafu algoritmi, nu ir struktūras, nu ir DP, nu ir greedy, etc. Skolas laikā par DP vispār ļoti maz biju zinājis. Kaut arī vienu uzdevumu vēl ilgi atcerēšos (jo biju šausmīgi pārsteigts, ka to nevar atrisināt ne ar kādu citu metodi... derēja tikai DP) :)
- jautājums. Olimp, laikam arī TopCoder, USACO, varbūt CodeChef... nezinu, vai tolaik jau biju zinājis par CodeForces. Bet, manuprāt, nav tik svarīgi regulāri piedalīties, cik mācīties teorētisko daļu. Pat ja ar to nepietiks priekš 1.-ās vietas IOI, tad vismaz tā noderēs pēc skolas pabeigšanas :)
- jautājums. Vēl kaut kas? Nu, labi. Svarīgākais, manuprāt, ir motivācija. Ja ir motivācija, tad gan teoriju iemācīsies, gan arī regulāri piedalīsies visādos turnīros. Bet motivācija rodas no apziņas. Kāpēc skolēnam vispār vajag kaut kur piedalīties? Kāpēc vispār kaut ko mācīties? Var būt labāk pamācīties bioloģiju, nevis algoritmus? Vai tas noderēs dzīvē? Visādas tādas domas rodas tieši vidusskolā un pārsvarā paliek neatbildētas. Es atceros, ka biju stipri "vīlies", kad uzzināju, ka par medaļām IOI (vai laikam arī BOI?) dod naudas balvas! Šausmas... kas nu motivē labāk par naudu? Manuprāt, par šo jāzina visiem olimpiešiem vēl pirms viņi piedalās valsts (III) kārtā. Es gan biju nožēlojis, ka neuzzināju šo niansi vismaz 11. klasē. Kaut arī cits varētu apstrīdēt, ka motivācijai vajadzētu būt kaut drusku "morālākai"... Tam ir grūti piekrist, jo nauda ir objektīvi labs motivators :DDD
Mārtiņa Frolova aptauja
- jautājums. Ar sporta programmēšanu nodarbojos nedaudz 7. klasē. Bet, atsāku sportiski programmēt vasarā, starp 9. un 10. klasi. Praktiski sāku no paša sākuma, jo nezināju pat kā definē mainīgos, un nezināju par masīva konceptu. Programmēju visai intensīvi. Tas bija mans hobijs un darbs. Es mērķtiecīgi un sistemātiski, regulāri risināju pa uzdevumam. Ja es nedēļu nebiju neko risinājis, tas jau bija ļoti ilgi. Reizēm pie programmēšanas tika pavadītas 5 h dienā, reizēm 2 h dienā. Medaļu izdevās iegūt olimpiādē, kad gāju 11. klasē. Tajā pašā gadā aŗi kvalificējos uz BOI un arī uz IOI. Es teiktu, ka gatavošanās bija ļoti intensīva. Kad biju uz viļņa, tad risināju katru dienu, pa vairākām stundām dienā.
- jautājums. Treniņiem uzdevumi tika izvēlēti pēc random kārtības. Es bieži piedalījos tiešsaistes sacensībās, un tur es vēroju kāda tipa uzdevumi parādās un, kurus nespēju atrisināt. Tas šo random izvēles kārtību vairāk noslieca uz šo, nezināmo uzdevumu pusi. Es risināju SPOJā, izvēlējos randomā izlasot kādus 2 līdz 5 uzdevumus, un vienu no tiem paņēmu. Parasti preference bija tiem uzdevumiem, kuri iepriekš izmantoti skolēnu olimpiādēs.
- jautājums. Lasīju Kormena grāmatu, atsevišķas nodaļas. Lasīju spoj forumos, un topcoder forumos uzdevumu risinājumus. Lasīju USACO uzdevumu analīzes, lasīju Krievijas un Ukrainas olimpiāžu uzdevumu analīzes. Bet, dominēja tieši praktiskā daļa - uzdevumu risināšana. Materiālu lasīšanai daudz uzmanības nepievērsu. Pievērsu tikai tad, ja bija uzdevums, kuru nevarēju atrisnāt. Lietoju arī topcoder algorithm tutoriāļus.
- jautājums. Pirms olimpiādes gāju cauri visiem atrisinātajiem uzdevumiem, lai būtu prātā visas risināšanas tehnikas. Palasīju skaidrojumus supergrūtiem uzdevumiem, no dažādiem avotiem. Un vienkārši daudz risināju uzdevumus.
- jautājums. Atbilde uz 4. jautājumu :)
- jautājums. Parasti šo divu dienu laikā ir čills. Nav mēģinājumi papildus sagrābt jaunas zināšanas. Vairāk mēģināju relaksēties, un domas bija pie attiecīgās dienas uzdevumiem, un pie tā kā tos varēja vislabāk atrisnāt.
- jautājums. Lasu - ja patīk un var uzkodēt, kodēju. Reizēm pat neizlasīju visus, pirms sāku kodēt. Kad esmu uzkodējis tos, kurus varu, domāju par neatrisinātajiem uzdevumiem - par nepilnīgiem risinājumiem.
- jautājums. Parasti es rupjā spēka metodes nelietoju. Parasti rakstu tikai tad, ja domāju, ka dabūšu kādus 20% . Parasti tumsā šaut pa mērķi man nepatīk. Tā vietā lai rakstītu rupjā spēka algoritmus - veltu laiku lai padomātu par kaut ko efektīvāku par rupjo spēku, kaut arī tas iegūtu 20%.
- jautājums. Parasti pēc uzdevuma atrisināšanas uzrakstīju 5 - 10 testus. Ja uzdevums ir komplicēts tad rakstu vairāk testu, lai būtu drošība. Bieži izķēru bugus caur testēšanu. Ja atlika vairāk laika, tad domāju vairāk testus. Pat ir bijuši gadījumi, kad rakstu vienkāršu rupjā spēka risinājumu, lai pie mazākiem testiem noskaidrotu vai atbildes ar manu risinājumu sakrīt.
- jautājums. Parasti es mēģinu nobeigt iesākto, cerībā, ka pietiks laika. Ja ir maz laika, un neesmu neko uzsācis, tad arī nesāku, parasti mēģinu notestēt jau esošos risinājumus. Eju cauri kodam, veidoju jaunus testus utt.
- jautājums. Parasti izmantoju zīmēšanu, jo tādā veidā ir vieglāk simulēt uzdevumā notiekošos procesus. Olimpiādes laikā parasti zimēju kādos 50% gadījumu. Bet, gandrīz jebkuram uzdevumam kaut ko uzrakstīju, pazīmēju. Parasti rakstīšanas ga'dijumā, ar roku domāju test keisus, un ar roku bieži arī risināju šos idomātos testus. Reizēm arī rakstu random keisus, lai tikai labāk aptvertu, kādi varētu būt uzdevumā iespējamie robežgadījumi.
- jautājums. Dažas nedēļas pirms IOI, BOI noteik ļoti intensīva gatavošanās. 3 dienas pirms olimpiādes - relaksācija.
- jautājums. DP, grafi, grīdijs, datu struktūras (intervālu koki, piemēram), matemātika/cietie rieksti, "tehniskie" .
- jautājums. Topcoder, SPOJ, olimps, USACO, COCI.
- jautājums. Bez komentāriem :)