Yazıda bazı ek notları en altta belirttim, ¹²³ gibi sayılar ek not numarasına işaret ediyor. Bunlar genelde kaynak önerisi.

Bilgisayar olimpiyatı veya rekabetçi programlama, bir veya daha fazla problemin belirli bir süre içerisinde bazı algoritmalar kullanılarak bir kod ile çözülmesiyle gerçekleştirilen zeka sporudur. Daha halk diliyle açıklamak gerekirse, size birkaç problem veriliyor, ve siz bu problemi doğru algoritmaları kullanan kodunuzla çözmeye çalışıyorsunuz ve kodunuz verilen süre ve bellek limiti içerisinde doğru sonuçları verecek şekilde çalışırsa problemi çözmüş sayılıyorsunuz ve bundan puan alıyorsunuz. Merak eden için tatlı bir örnek soru.

Bilgisayar olimpiyatına ortaokul/lise öğrencisiyseniz TÜBİTAK'ın düzenlediği Ulusal Bilim Olimpiyatları'na katılarak başlayabilirsiniz. Süreçle ilgili detaylı bilgi bu adresten edinilebilir.

Peki, bilgisayar olimpiyatına nasıl çalışmalıyım? 1. aşama için genellikle kombinatorik konusuna¹ ve C diline² (ince detayları çok önemli) çalışmanız ve eski 1. aşama sorularını deneme formatında çözmeniz yeterli olur. 1. aşamada 35 matematik, 15 de C sorusu sorulur (ortaokullar için 20 matematik 10 C sorusu). 1. aşamada iyi bir net yapıp ülkede yaklaşık ilk 60'a girebildiyseniz (bu sayı senelere göre değişebiliyor, kısaca yapabildiğinizin en iyisini yapın) yaz okuluna ve 2. aşamaya katılmaya hak kazanıyorsunuz. İşte asıl rekabetçi programlama bu noktada başlıyor.

Yaz okulu, okullar başlamadan önce 1 hafta yüz yüze ve başladıktan sonra 1 hafta çevrimiçi olarak toplam 2 hafta yapılır. Burada sınıflar ikiye ayrılır, deneyimsizler ve deneyimliler şeklinde. İlk sınıfta programlamanın temelleri ve genel 2. aşama konuları anlatılırken ikinci sınıfta öğrenciler tamamen gelişmeye odaklı bir şekilde çalışırlar. Kampın yüz yüze olan kısmı Afyon'da (değişebilir) 5 yıldızlı bir otelde yapılır. Otel ve yol masrafları tamamen TÜBİTAK tarafından karşılanır. Bu kamplarda nasıl çalışmanız gerektiğini genel olarak öğrenirsiniz.

İkinci aşamaya hazırlanırken³ deneyimli olimpiyatçılardan destek almanızı kesinlikle öneririm, çünkü bundan asla rahatsızlık duymazlar ve bir şeyleri öğrenmenizin en iyi yolu da budur. Ayrıca önceden söylemem gerek ki 2. aşamaya yani Competitive Programming'e çalışırken İngilizcenizin yeterli seviyede olması çok önemli. Bunun dışında kesinlikle Codeforces, AtCoder ve benzeri sitelerde "contest"lere katılmanızı öneririm. CSES Problem Setinden problemler çözmeniz de kesinlikle faydalı olacaktır. Ayrıca bu çözdüğünüz sitelerde hesaplarınızın grafiklerini ara sıra kontrol etmek kesinlikle bir motivasyon getirecektir, ancak sakın çözdüğünüz problem sayısını basit bir istatistikten öte amaç haline getirmeyin ve bunun için basit problemleri çözmeye takılı kalmayın. Şunu unutmayın, CP'de haftada bir birkaç problem çözerek gelişemezsiniz, aktif bir çalışmaya ihtiyacınız var. Aklınızda sürekli problemler, çözümler dolaşmalı ve en önemlisi bu işten zevk almalısınız. Terminolojiyi öğrenin, submission'unuzun WA alması ile TLE alması arasındaki farkı bilmeniz ve bu durumlarda ne yapmanız gerektiğini anlamanız gerek. Notlarınızın bulunduğu bir arşiviniz olsun. Benim genelde önemli hatalarımı veya bazı algoritma/veri yapılarının implementasyonlarını attığım bir arşivim var mesela, içinde unuttuğum detaylar olursa hızlıca göz atabileceğim bir Dijsktra'nın algoritması implementasyonu ve "INF macrosunu limitlere uygun şekilde ayarlamayı unutma" (bir keresinde bu hatayı yaptığım için WA almıştım) gibi notlar var.

2. aşamayı geçtikten sonra yapmanız gereken ise takım seçme sınavına hazırlanmak. Bu aşamada kış kampı da yapılır ve gerekli konuları öğreniyorsunuz. Artık muhtemelen nasıl çalışmanız gerektiğini bildiğiniz için buna da çalışabilirsiniz. Fakat yine de vurgulamak istiyorum, bol bol problem çözüp contestlere katılın ve yardım istemekten çekinmeyin. Çevrimiçi topluluklara da katılabilirsiniz. Türk bir bilgisayar olimpiyatı Discord sunucusu var fakat buraya atmamın reklam sayılıp sayılmayacağı konusunda kararsız olduğum için atmamayı tercih ediyorum, belki bilgisayar olimpiyatıyla alakalı bazı Türkçe kaynaklarda linkini bulabilirsiniz.

Aklınızda soru işareti kaldıysa bu konu altında sorabilirsiniz.

Ek notlar:
  1. "Sonlu Matematik Olimpiyat Soruları ve Çözümleri" adlı kitap işinize yarayacaktır (bilgisayar olimpiyatçıları arasında kısaca mor kitap denir).
  2. Ram Kumar'ın Programming in ANSI C adlı kitabı işinize yarayacaktır. 1. aşamada en sıkıntılı konulardan bazıları işlem önceliği ve kodun çalıştırılma sırası, bunun için şu tabloyu bırakıyorum.
  3. Radewoosh'un şu yazısını okumanızı öneririm. Ayrıca TheScrasse adlı CF kullanıcısının hazırladığı şöyle bir yol haritası var, buna da göz atabilirsiniz.
 
Eski bir olimpiyatçı olarak söylüyorum ki, geçmiş soruları indirip çıkarttırmayı veya tabletiniz vs. varsa orada çözmeyi unutmayın. Yukarıda bahsedildiği gibi, CodeForces gibi sitelerden sık sık problem çözün. Ayrıca, C dilinin sadece bilinen kısımlarına odaklanıp vakit kaybetmeyin. "Undefined behavior", yani ortamdan ortama değişken olan kısımları zaman içinde hata yapa yapa, bilginize bilgi kata kata öğreneceksiniz. Örneğin int yapısının boyutunun bazı mimarilerde 2 byte, bazı mimarilerde 4 byte olduğunu zamanla kazandığınız tecrübeler size öğretecek. Çözdüğünüz probleme yine dönüp editorial'dan çözümüne bakın, size yorum katacaktır.

Birinci aşamaya girmeden önce pointer aritmetiği, veri yapıları ve sonlu olasılığa kesinlikle hakim olmalısınız. Örneğin, benim yaptığım gibi, Josephus problemi sorusu görünce ışık görmüş tavşan gibi kalmayacaksınız. Ayrıca, sonlu durum makineleri hakkında bilgi sahibi olmanız da çok iyi olacaktır. Çünkü bazen string (kelime katarı :D ) ve patern soruları oluyor ve sonlu durum makinesi verip sizden onu yorumlamanızı isteyebiliyor.

Ayrıca birinci veya ikinci aşamaya kalabildiyseniz, üniversite sınavında (artık okuduğunuz tarihte adı ne olacaksa) ek katsayı uygulaması yapılıyor. Uluslararasına katılıp madalya ile ülkemize dönerseniz de üniversitelere sınavsız yerleştirme hakkına sahip oluyorsunuz. Duyduğum kadarıyla yurtdışında da burslu okuyanlar oluyor uluslararasında derece yapıp.

Size belki ütopik geliyor olabilir arkadaşlar fakat bunu yapanlar da insan. Programlamayı gerçek anlamda seviyorsanız, katılıp şansınızı denemenizde fayda var. Ben birinci aşama kampına bile kalamadım o zamanki matematik bilgimin yetersizliğinden dolayı ama vaktiniz varsa -3 ayda "hazırlanmıştım"- bunlar halledilmeyecek şeyler kesinlikle değil. En önemlisi ise, hiçbir şey kazanmasanız bile disipline olmanızı sağlıyor. Kendi kendinize söz geçirebiliyorsunuz.

Birkaç kaynak atayım bari:
Main Page - Algorithms for Competitive Programming -> Burayı algoritma referansı olarak da kullanabilirsiniz, algoritmaları öğrenmek için de.
CLIST -> Dünya genelinde yaklaşan CP yarışmalarını buradan takip edebilirsiniz.
I compiled a list of almost all useful blogs ever published on Codeforces [update: till 09.06.2021] - Codeforces -> Burada ise çoook geniş bir kaynak listesi mevcut.

Kolay gelsin!
 
Konuyu hortlatmış olacağım biraz ama bir sorum var 1. aşamayla ilgili. 1. aşamada genellikle iptal edilen sorular oluyor ya. O sorular net olarak nasıl hesaplanıyor? Mesela 4 tane iptal edilen soru varsa ve ben tüm soruları doğru yaparsam 46 netim mi oluyor yoksa 50 mi?
 
Konuyu hortlatmış olacağım biraz ama bir sorum var 1. aşamayla ilgili. 1. aşamada genellikle iptal edilen sorular oluyor ya. O sorular net olarak nasıl hesaplanıyor? Mesela 4 tane iptal edilen soru varsa ve ben tüm soruları doğru yaparsam 46 netim mi oluyor yoksa 50 mi?
Doğru sayılıyorlar, 50 netin oluyor.