Competitive programming (CP) adalah olahraga mental: menyelesaikan soal algoritma dalam batas waktu ketat, biasanya 2–5 jam, dengan input/output terstandarisasi. Berbeda dengan DSA akademis yang fokus pada kebenaran teoretis, CP menuntut kecepatan kode, akurasi implementasi, dan strategi pengambilan keputusan di bawah tekanan. Pada Chapter ini kita akan memetakan ekosistem CP — platform utama, sistem rating, dan mengapa CP mempercepat penguasaan DSA. Tujuan akhirnya: memahami lanskap kompetisi sebelum mulai berlatih secara terstruktur.
Platform dan Judge Utama #
| Platform | Bahasa | Format Kontes | Rating System |
|---|---|---|---|
| Codeforces | Rusia, 2010 | 5–8 soal, 2 jam | Elo-like (0–4000) |
| AtCoder | Jepang, 2012 | ABC/ARC/AGC, 6–8 soal | 0–9999 |
| LeetCode | AS, 2015 | 1–4 soal weekly | Rating kontestan |
| HackerRank | AS, 2009 | Project Euler, Problem Solving | Badge-based |
| Google Code Jam | Google (2008–2022) | 4–5 soal per round | Eliminasi per ronde |
| Meta Hacker Cup | Meta (2011–) | Mirip Code Jam | Eliminasi per ronde |
| IOI | International Olympiad (untuk siswa SMA) | 3 soal/hari × 2 hari | Medali per negara |
| ICPC | International Collegiate (universitas) | 5 jam, 8–12 soal tim | Berdasarkan jumlah solve |
Mengapa CP Mempercepat Penguasaan DSA #
CP mengajarkan tiga keterampilan yang sulit didapat dari buku teks:
- Implementasi cepat dan akurat — dalam kontes 2 jam, 30 menit debugging sama dengan tidak solve. Latihan terus-menerus melatih otot memori untuk pola kode (binary search, BFS, DP).
- Estimasi kompleksitas dari constraint — melihat
n ≤ 10^5langsung tahu “harus O(n log n)”. Skill ini sulit diajarkan teoretis tetapi instinktif setelah ratusan soal. - Strategi pengambilan keputusan — kapan lanjut, kapan skip, kapan upsolve. Kontes mengajarkan disiplin waktu yang tidak ada di tutorial.
Tabel berikut menunjukkan korelasi tingkat CP dengan kemampuan DSA:
| Rating (Codeforces) | Setara | Kemampuan Tipikal |
|---|---|---|
| 800–1200 | Newbie | Implementasi O(n) sederhana, sorting, searching |
| 1200–1400 | Pupil | Greedy, prefix sum, basic DP |
| 1400–1600 | Specialist | Binary search, graph traversal, mod arithmetic |
| 1600–1900 | Expert | DP tingkat menengah, segment tree, DSU |
| 1900–2100 | Candidate Master | Advanced DP, graph algorithm, sqrt decomposition |
| 2100–2400 | Master | Lazy propagation, heavy-light, FFT |
| 2400+ | Grandmaster | Advanced math, creative problem solving |
Mekanisme: Cara Kerja Judge #
Judge adalah server yang menerima submission kode, mengkompilasi, menjalankan terhadap test case tersembunyi, dan memberi verdict. Format verdict standar:
| Verdict | Singkatan | Penyebab Tipikal |
|---|---|---|
| Accepted | AC | Solusi benar untuk semua test |
| Wrong Answer | WA | Output berbeda dari expected |
| Time Limit Exceeded | TLE | Waktu > batas (biasanya 1–2 detik) |
| Memory Limit Exceeded | MLE | Memori > batas (biasanya 256 MB) |
| Runtime Error | RE | Segfault, exception, exit code non-zero |
| Compilation Error | CE | Sintaks salah |
| Presentation Error | PE | Format output hampir benar (jarang) |
Kode: Template Solusi CP Minimal #
Berikut adalah template solusi CP paling minimal untuk soal “maksimum n integer”:
#include <iostream>
#include <vector>
#include <algorithm>
// Soal: diberikan n integer, outputkan nilai maksimum.
int solve_max(const std::vector<int>& a) {
if (a.empty()) return 0;
int best = a[0];
for (int x : a) best = std::max(best, x);
return best;
}
int main() {
// Format input CP standar:
// Baris 1: n
// Baris 2: n integer dipisah spasi
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++i) std::cin >> a[i];
// Output: jawaban tunggal.
std::cout << solve_max(a) << '\n';
return 0;
}Untuk menjalankan dengan input manual:
g++ -std=c++17 -O2 -o solusi solusi.cpp
echo "5
3 9 2 7 5" | ./solusiOutput yang Dihasilkan:
9Bedah Kode Baris-per-Baris #
#include <iostream>: header untukstd::cin(input) danstd::cout(output). Wajib di setiap solusi CP.int n; std::cin >> n;: baca integer pertama sebagai jumlah elemen. Pola “baca n dulu, kemudian n elemen” adalah format paling umum di CP.std::vector<int> a(n); for (int i = 0; i < n; ++i) std::cin >> a[i];: alokasi vector berukurannkemudian bacanelemen. Alternatif:std::vector<int> a; a.reserve(n);lalupush_back.int best = a[0];: inisialisasi dengan elemen pertama, bukan0— bila semua elemen negatif,best = 0akan salah.std::cout << solve_max(a) << '\n';: cetak jawaban dengan newline. Beberapa judge ketat terhadap newline — selalu sertakan'\n'di akhir.
Jenis Kontes Utama #
| Jenis | Durasi | Tim/Individu | Frekuensi | Cocok untuk |
|---|---|---|---|---|
| Weekly contest (Codeforces, AtCoder) | 1.5–2 jam | Individu | Mingguan | Latihan rutin |
| Educational Round | 2 jam | Individu | Bulanan | Belajar topik |
| Div 1 / Div 2 / Div 3 / Div 4 | 2 jam | Individu | Mingguan | Sesuai rating |
| ICPC regional | 5 jam | Tim 3 orang | Tahunan | Universitas |
| IOI national selection | 5–6 jam | Individu | Tahunan | Siswa SMA |
Sumber Belajar Tambahan #
- cp-algorithms.com: ensiklopedia algoritma CP, dengan implementasi C++.
- USACO Guide: kurikulum terstruktur dari pemula hingga advanced.
- Codeforces Editorials: penjelasan resmi setelah kontes.
- AtCoder Editorial: biasanya ringkas, fokus pada inti solusi.
Ringkasan #
- CP adalah olahraga mental menyelesaikan soal algoritma dalam batas waktu ketat.
- Platform utama: Codeforces, AtCoder, LeetCode, IOI, ICPC.
- CP mempercepat penguasaan DSA melalui implementasi cepat, estimasi kompleksitas, dan strategi keputusan.
- Verdict (AC, WA, TLE, MLE, RE, CE) bukan diagnosa akurat — analisis ulang kode selalu.
- Template solusi CP minimal:
#include, baca input, solve, cetak output dengan newline. - Untuk pemula, mulai dengan AtCoder ABC dan Codeforces Div 3/Div 4.