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 #

PlatformBahasaFormat KontesRating System
CodeforcesRusia, 20105–8 soal, 2 jamElo-like (0–4000)
AtCoderJepang, 2012ABC/ARC/AGC, 6–8 soal0–9999
LeetCodeAS, 20151–4 soal weeklyRating kontestan
HackerRankAS, 2009Project Euler, Problem SolvingBadge-based
Google Code JamGoogle (2008–2022)4–5 soal per roundEliminasi per ronde
Meta Hacker CupMeta (2011–)Mirip Code JamEliminasi per ronde
IOIInternational Olympiad (untuk siswa SMA)3 soal/hari × 2 hariMedali per negara
ICPCInternational Collegiate (universitas)5 jam, 8–12 soal timBerdasarkan jumlah solve

Mengapa CP Mempercepat Penguasaan DSA #

CP mengajarkan tiga keterampilan yang sulit didapat dari buku teks:

  1. 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).
  2. Estimasi kompleksitas dari constraint — melihat n ≤ 10^5 langsung tahu “harus O(n log n)”. Skill ini sulit diajarkan teoretis tetapi instinktif setelah ratusan soal.
  3. 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)SetaraKemampuan Tipikal
800–1200NewbieImplementasi O(n) sederhana, sorting, searching
1200–1400PupilGreedy, prefix sum, basic DP
1400–1600SpecialistBinary search, graph traversal, mod arithmetic
1600–1900ExpertDP tingkat menengah, segment tree, DSU
1900–2100Candidate MasterAdvanced DP, graph algorithm, sqrt decomposition
2100–2400MasterLazy propagation, heavy-light, FFT
2400+GrandmasterAdvanced 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:

VerdictSingkatanPenyebab Tipikal
AcceptedACSolusi benar untuk semua test
Wrong AnswerWAOutput berbeda dari expected
Time Limit ExceededTLEWaktu > batas (biasanya 1–2 detik)
Memory Limit ExceededMLEMemori > batas (biasanya 256 MB)
Runtime ErrorRESegfault, exception, exit code non-zero
Compilation ErrorCESintaks salah
Presentation ErrorPEFormat output hampir benar (jarang)

Kode: Template Solusi CP Minimal #

Berikut adalah template solusi CP paling minimal untuk soal “maksimum n integer”:

cpp
#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:

bash
g++ -std=c++17 -O2 -o solusi solusi.cpp
echo "5
3 9 2 7 5" | ./solusi

Output yang Dihasilkan:

text
9

Bedah Kode Baris-per-Baris #

  1. #include <iostream>: header untuk std::cin (input) dan std::cout (output). Wajib di setiap solusi CP.
  2. int n; std::cin >> n;: baca integer pertama sebagai jumlah elemen. Pola “baca n dulu, kemudian n elemen” adalah format paling umum di CP.
  3. std::vector<int> a(n); for (int i = 0; i < n; ++i) std::cin >> a[i];: alokasi vector berukuran n kemudian baca n elemen. Alternatif: std::vector<int> a; a.reserve(n); lalu push_back.
  4. int best = a[0];: inisialisasi dengan elemen pertama, bukan 0 — bila semua elemen negatif, best = 0 akan salah.
  5. std::cout << solve_max(a) << '\n';: cetak jawaban dengan newline. Beberapa judge ketat terhadap newline — selalu sertakan '\n' di akhir.

Jenis Kontes Utama #

JenisDurasiTim/IndividuFrekuensiCocok untuk
Weekly contest (Codeforces, AtCoder)1.5–2 jamIndividuMingguanLatihan rutin
Educational Round2 jamIndividuBulananBelajar topik
Div 1 / Div 2 / Div 3 / Div 42 jamIndividuMingguanSesuai rating
ICPC regional5 jamTim 3 orangTahunanUniversitas
IOI national selection5–6 jamIndividuTahunanSiswa 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.