Kontestan berpengalaman tidak menulis kode dari nol pada setiap kontes. Mereka punya template — file .cpp berisi includes, typedefs, macros, dan helper functions yang sering dipakai. Template ini disalin untuk setiap soal baru, menghemat 5–10 menit setup dan menghindari kesalahan ketik berulang. Pada Chapter ini kita akan membangun template kompetisi lengkap: include semua STL, typedefs, konstanta (MOD, INF), macros loop (REP, FOR, FORD), math helpers (power, gcd, lcm), dan debug macro. Tujuan akhirnya: kita punya satu file .cpp yang siap tempur untuk mayoritas soal CP.

Komponen Template Kompetisi Standar #

KomponenTujuan
#include <bits/stdc++.h>Semua header STL sekaligus (GCC only)
using namespace std;Hindari prefix std::
typedefSingkatan tipe: ll, vi, pii, dst.
KonstantaMOD = 1e9+7, INF = 1e18
Macros loopREP(i, n), FOR(i, a, b), FORD(i, a, b)
Macros containerALL(v), SZ(x), pb, mp
Fast I/Osetup_io() dengan sync_with_stdio(false)
Math helperspower, gcd, lcm, modinv
Debug macroDBG(x) aktif hanya bila LOCAL_DEBUG defined

Mekanisme: Mengapa Setiap Komponen Penting #

  1. bits/stdc++.h: menggabungkan semua header STL standar (<iostream>, <vector>, <algorithm>, <unordered_map>, dst.) dalam satu file. Menghemat waktu menulis 10+ include per soal.
  2. typedef ll = long long: menulis ll lebih cepat dari long long, dan secara visual membedakan tipe dari int. Konvensi populer di komunitas CP.
  3. Konstanta MOD = 1e9+7: modulo standar di mayoritas soal yang meminta jawaban modulo bilangan prima besar. 1e9+7 cukup besar untuk menghindari overflow intermediate tetapi cukup kecil untuk long long menampung perkalian.
  4. Macros loop: REP(i, n) lebih ringkas dari for (int i = 0; i < n; ++i). Kode 30% lebih pendek — krusial untuk kontes 2 jam.
  5. Fast I/O: dua baris sync_with_stdio(false) + cin.tie(nullptr) mengubah TLE menjadi AC pada soal dengan input besar.
  6. Math helpers: power(base, exp, mod) untuk modular exponentiation — wajib di soal kombinatorika. gcd, lcm muncul di banyak soal number theory.
  7. Debug macro: DBG(x) mencetak x = nilai ke stderr saat LOCAL_DEBUG defined. Saat submit, build tanpa define → debug hilang otomatis.

Kode: Template Kompetisi Lengkap #

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

// ----- Typedefs umum -----
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef vector<string> vs;
typedef vector<vi> vvi;
typedef vector<vll> vvll;

// ----- Constant -----
const int MOD = 1e9 + 7;
const ll INF = 1e18;
const int INF_INT = 1e9;

// ----- Macros -----
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)
#define FORD(i, a, b) for (int i = (a); i >= (b); --i)
#define ALL(v) (v).begin(), (v).end()
#define SZ(x) ((int)(x).size())
#define pb push_back
#define mp make_pair
#define fi first
#define se second

// ----- Debug macro -----
#ifdef LOCAL_DEBUG
#define DBG(x) cerr << #x << " = " << (x) << '\n'
#else
#define DBG(x)
#endif

// ----- Fast I/O -----
void setup_io() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}

// ----- Math helpers -----
template<typename T>
T power(T base, T exp, T mod) {
    T result = 1;
    base %= mod;
    while (exp > 0) {
        if (exp & 1) result = (result * base) % mod;
        base = (base * base) % mod;
        exp >>= 1;
    }
    return result;
}

ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

// ----- Contoh solve function -----
ll solve_sum(const vi& a) {
    ll s = 0;
    for (int x : a) s += x;
    return s;
}

int main() {
    setup_io();

    int n;
    cin >> n;
    vi a(n);
    REP(i, n) cin >> a[i];

    ll result = solve_sum(a);
    cout << result << '\n';

    cout << "\n=== Template Kompetisi Siap Pakai ===\n";
    cout << "1. #include <bits/stdc++.h>    (semua header STL)\n";
    cout << "2. typedef ll, vi, pii, ...\n";
    cout << "3. MOD = 1e9+7, INF = 1e18\n";
    cout << "4. Macros: FOR, REP, FORD, ALL, SZ, pb, mp\n";
    cout << "5. setup_io() dengan sync_with_stdio(false)\n";
    cout << "6. Math helpers: power, gcd, lcm\n";
    cout << "7. Debug macro DBG(x) (hanya aktif bila LOCAL_DEBUG)\n\n";

    cout << "=== Konstanta Wajib ===\n";
    cout << "MOD = " << MOD << " (modulo standar)\n";
    cout << "INF = " << INF << " (long long max)\n";
    cout << "INF_INT = " << INF_INT << " (int max)\n\n";

    cout << "=== Macro Loop ===\n";
    cout << "REP(i, n)      -> for (i = 0; i < n; i++)\n";
    cout << "FOR(i, a, b)   -> for (i = a; i < b; i++)\n";
    cout << "FORD(i, a, b)  -> for (i = a; i >= b; i--)\n";
    return 0;
}

Untuk input 5\n3 9 2 7 5:

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

Output yang Dihasilkan:

text
26

=== Template Kompetisi Siap Pakai ===
1. #include <bits/stdc++.h>    (semua header STL)
2. typedef ll, vi, pii, ...
3. MOD = 1e9+7, INF = 1e18
4. Macros: FOR, REP, FORD, ALL, SZ, pb, mp
5. setup_io() dengan sync_with_stdio(false)
6. Math helpers: power, gcd, lcm
7. Debug macro DBG(x) (hanya aktif bila LOCAL_DEBUG)

=== Konstanta Wajib ===
MOD = 1000000007 (modulo standar)
INF = 1000000000000000000 (long long max)
INF_INT = 1000000000 (int max)

=== Macro Loop ===
REP(i, n)      -> for (i = 0; i < n; i++)
FOR(i, a, b)   -> for (i = a; i < b; i++)
FORD(i, a, b)  -> for (i = a; i >= b; i--)

Bedah Kode Baris-per-Baris #

  1. #include <bits/stdc++.h>: header non-standar GCC yang menggabungkan semua STL. Tidak portabel ke MSVC — untuk produksi, pakai header spesifik.
  2. typedef long long ll;: alias ll untuk long long. Demikian juga vi = vector<int>, pii = pair<int,int>. Konvensi ini umum di Codeforces.
  3. const int MOD = 1e9 + 7;: konstanta modulo. Ditulis 1e9 + 7 (literal double 1e9 kemudian cast ke int) — hati-hati: 1e9 + 7 dievaluasi sebagai 1.0e9 + 7 = 1.0e9 + 7.0 = 1.000000007e9, kemudian cast int. Hasilnya 1000000007 — benar untuk konstanta ini.
  4. #define REP(i, n) FOR(i, 0, n): macro loop sederhana. REP(i, n) ekspansi menjadi for (int i = 0; i < (n); ++i). Pastikan n dievaluasi sekali — (n) dalam tanda kurung.
  5. #define ALL(v) (v).begin(), (v).end(): idiom untuk std::sort(ALL(v)) — setara dengan std::sort(v.begin(), v.end()). Lebih ringkas.
  6. #define DBG(x) cerr << #x << " = " << (x) << '\n': macro debug. #x stringifikasi — bila DBG(my_var), menghasilkan "my_var = " << my_var. Hanya aktif bila LOCAL_DEBUG defined.
  7. ios::sync_with_stdio(false); cin.tie(nullptr);: setup fast I/O. Wajib di awal main().
  8. T power(T base, T exp, T mod): modular exponentiation dengan binary exponentiation. Kompleksitas O(log exp). Untuk base = 2, exp = 30, hasil 2^30 mod (1e9+7) = 73741817.
  9. ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }: algoritma Euclidean. Kompleksitas O(log min(a, b)). lcm dihitung sebagai a / gcd(a, b) * b — bagi dulu untuk menghindari overflow intermediate.

Konstanta dan Helper tambahan yang Sering Dipakai #

cpp
const double EPS = 1e-9;
const double PI = acos(-1.0);

// Direction vectors untuk BFS/DFS pada grid
const int dx[] = {0, 0, 1, -1, 1, 1, -1, -1};
const int dy[] = {1, -1, 0, 0, 1, -1, 1, -1};

// Mod inverse (Fermat's little theorem, hanya untuk mod prima)
ll modinv(ll a, ll mod) { return power(a, mod - 2, mod); }

Cara Pakai Template Saat Kontes #

  1. Salin template ke file baru untuk setiap soal (mis. A.cpp, B.cpp, dst.).
  2. Edit solve_sum atau ganti dengan fungsi solve sesuai soal.
  3. Compile dengan flag debug saat development: g++ -std=c++17 -O2 -DLOCAL_DEBUG -g -fsanitize=address,undefined.
  4. Test sample input dulu — bila salah, fix dengan bantuan DBG.
  5. Sebelum submit, build final tanpa define: g++ -std=c++17 -O2. Sanitizer dinonaktifkan agar tidak TLE di judge.

Checklist Template Sebelum Submit #

ItemVerifikasi
1. bits/stdc++.h includedYa (di GCC)
2. setup_io() dipanggil di awal main()Ya
3. Tipe data akumulator llYa untuk sum, product, kombinasi
4. MOD konsisten dengan soalBukan 1e9+7 bila soal minta 998244353
5. '\n' di akhir outputBukan endl
6. LOCAL_DEBUG tidak defined saat submitBuild tanpa define
7. DBG(x) tidak meninggalkan efek sampingPakai stream murni

Ringkasan #

  • Template kompetisi menghemat 5–10 menit setup per soal.
  • Komponen wajib: bits/stdc++.h, using namespace std, typedefs, konstanta (MOD, INF), macros loop, fast I/O, math helpers, debug macro.
  • bits/stdc++.h non-standar GCC — aman untuk Codeforces/AtCoder, hindari untuk produksi portabel.
  • typedef ll = long long adalah konvensi populer — kode 30% lebih ringkas.
  • MOD = 1e9+7 adalah konstanta modulo standar; soal bisa minta 998244353 — selalu baca soal.
  • DBG(x) dengan LOCAL_DEBUG memungkinkan debug aktif saat development, otomatis hilang saat submit.
  • Simpan template di snippet manager editor untuk akses cepat saat kontes.