Competitive Programming Tactics & Contests
Contest-ready mindset ও template
1. Mindset First
Contest-এ একটি working O(n²) একটি সুন্দর কিন্তু buggy O(n log n)-এর চেয়ে ভালো। Correct first, fast second. Template practice করে boilerplate মুখস্থ করে ফেলুন।
2. A Starter Template
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define FOR(i,a,b) for(int i=(a); i<(b); i++)
#define ll long long
void solve(void) {
int n;
scanf("%d", &n);
long long sum = 0;
FOR(i, 0, n) {
int x;
scanf("%d", &x);
sum += x;
}
printf("%lld\n", sum);
}
int main(void) {
int t; scanf("%d", &t);
while (t--) solve();
return 0;
}
3. Fast I/O
#include <stdio.h>
static inline int read_int(void) {
int n = 0, c = getchar_unlocked();
int neg = 0;
while (c == ' ' || c == '\n' || c == '\t') c = getchar_unlocked();
if (c == '-') { neg = 1; c = getchar_unlocked(); }
while (c >= '0' && c <= '9') { n = n * 10 + (c - '0'); c = getchar_unlocked(); }
return neg ? -n : n;
}
int main(void) {
int n = read_int();
long long sum = 0;
for (int i = 0; i < n; i++) sum += read_int();
printf("%lld\n", sum);
return 0;
}
Big input (10⁶+ numbers)-এ scanf-এর চেয়ে 5–10× দ্রুত। getchar_unlocked POSIX; Windows-এ _getchar_nolock বা নিজের buffered reader।
4. Top Pitfalls
- Integer overflow — 10⁵ × 10⁵ = 10¹⁰, 32-bit int overflow।
long longব্যবহার করুন। - Off-by-one — boundary, inclusive/exclusive range সতর্কতায় দেখুন।
- Uninitialized globals multi-test case-এ — প্রতি test শুরুতে reset।
- printf format —
long long→%lld। - Edge cases — n=0, n=1, duplicates, negatives, overflow।
- TLE — সাধারণত wrong complexity class।
5. Reading the Problem
- দুবার পড়ুন।
- Input size লক্ষ্য করুন — complexity budget।
- Sample হাতে করে দেখুন।
- Edge case টাইপ করার আগেই ভাবুন।
- আটকে গেলে ছোট version-এ চেষ্টা করুন।
6. Where to Practice
- Codeforces — প্রতি সপ্তাহে contest, rating, editorial।
- AtCoder — সুন্দর, পরিষ্কার সমস্যা।
- LeetCode — interview prep।
- SPOJ, UVa, Timus — classic archive।
- ICPC regional — জাতীয় ও আন্তর্জাতিক পর্যায়ে।
7. Practice Problems
- Reimplement fast I/O; benchmark.Fast I/O লিখে benchmark।
✨ Show Answer
Section 3 reference। scanf vs getchar_unlocked — 10⁶ ints-এ ~5–10× পার্থক্য।
- Solve 5 Codeforces Div. 2 A problems.5টি CF Div.2 A।
✨ Show Answer
Codeforces-এ "Problemset" → rating filter 800-1000 → any 5। প্রতিটিতে 15 min-এর বেশি না।
- 5 Div. 2 B problems.5টি Div.2 B।
✨ Show Answer
Rating 1100-1300। A-র চেয়ে একটু বেশি thinking; observation-ই key।
- Prefix sum problem.Prefix sum।
✨ Show Answer
ps[0] = 0; for (int i = 0; i < n; i++) ps[i+1] = ps[i] + a[i]; // sum [l, r] = ps[r+1] - ps[l]; - Two-pointer — pair sum on sorted array.Sorted array-এ two-pointer pair sum।
✨ Show Answer
l = 0, r = n-1। sum < target → l++; sum > target → r--; = target → found।
- Sliding window — longest substring without repeat.Sliding window।
✨ Show Answer
Frequency map; left expand যতক্ষণ repeat থাকে। ans = max(ans, r - l + 1)।
- Trailing zeros of n!.n!-এর trailing zero।
✨ Show Answer
Count 5, 25, 125, ... factor of n।
z = 0; while (n) { n /= 5; z += n; } - Range updates with difference array.Difference array দিয়ে range update।
✨ Show Answer
Range [l, r]-এ +v:
d[l] += v; d[r+1] -= v;শেষে prefix-sum দিয়ে রূপান্তর। - Segment tree for range sum / range min.Segment tree।
✨ Show Answer
4n array; recursive build/update/query। O(log n)। Lazy propagation range update-এ দরকার।
- Fenwick tree (BIT).Fenwick tree।
✨ Show Answer
int bit[N + 1]; void upd(int i, int v) { for (; i <= N; i += i & -i) bit[i] += v; } int qry(int i) { int s = 0; for (; i; i -= i & -i) s += bit[i]; return s; } - Union-Find with path compression + union by rank.Union-Find।
✨ Show Answer
int find(int x) { return par[x] == x ? x : (par[x] = find(par[x])); } void unite(int a, int b) { a = find(a); b = find(b); if (a == b) return; if (rnk[a] < rnk[b]) { int t = a; a = b; b = t; } par[b] = a; if (rnk[a] == rnk[b]) rnk[a]++; } - Sieve up to 10⁷.10⁷ sieve।
✨ Show Answer
L34 Section 4-এর sieve-ই — N = 10⁷। Memory: bit-compressed বা
chararray ব্যবহার করুন। - Binary lifting for LCA.Binary lifting LCA।
✨ Show Answer
up[v][k] = v-এর 2^k-তম ancestor। DFS-এ preprocess। Query-এ first সমান depth-এ আনুন, তারপর together lift।
- KMP string matching.KMP।
✨ Show Answer
Failure function (prefix-function) preprocess; match-এ fail হলে pattern-এ back-jump। O(n + m)।
- Z-function.Z-function।
✨ Show Answer
z[i] = longest match of s[i..] with s[0..]। Linear scan with "z-box" window। O(n)।
- Trie.Trie।
✨ Show Answer
Node-এ children array (26 বা 256); insert/search প্রতি char-এ O(L)।
- Suffix array — introduction.Suffix array (intro)।
✨ Show Answer
Suffix-গুলো sorted। Naive O(n²·log n); better O(n log² n) বা O(n log n) SA-IS। LCP array combined powerful।
- Mo's algorithm — idea.Mo's algorithm।
✨ Show Answer
Offline query [l, r]-গুলো √n block-এ sort করে process। Pointer slowly move, reuse। O((n + q) √n)।
- Bitmask DP — n ≤ 20.Bitmask DP।
✨ Show Answer
L33 reference: TSP। State = (mask, last vertex)।
- Digit DP.Digit DP।
✨ Show Answer
L33 reference। State = (pos, tight, extra)।
- Game theory — Nim, Sprague–Grundy.Nim, Sprague-Grundy।
✨ Show Answer
Nim: XOR sum = 0 হলে loser। Sprague-Grundy: প্রতিটি game position-এ g(pos) = mex{g(reachable positions)}।
- Convex hull.Convex hull।
✨ Show Answer
Andrew's monotone chain: points sort করুন; upper + lower hull build। O(n log n)।
- Ternary search.Ternary search।
✨ Show Answer
Unimodal function-এ min/max। Range-কে ৩ ভাগে ভাগ করুন, পাশের ২/৩ ফেলে দিন। O(log n)।
- SQRT decomposition.Sqrt decomposition।
✨ Show Answer
Array-কে √n block-এ ভাগ করুন; block-wise aggregate store। Query/update O(√n)।
- Heavy-light decomposition — concept.HLD।
✨ Show Answer
Tree-কে heavy/light edge-এ ভাগ। Path queries O(log²n) হয় segment tree combined। Advanced topic।
- Link/cut trees — concept.Link/cut trees।
✨ Show Answer
Splay tree-ভিত্তিক dynamic tree structure। Path queries + link/cut — all O(log n) amortized।
- Persistent data structures — concept.Persistent data structures।
✨ Show Answer
Update-এ নতুন version তৈরি হয়, পুরনো পাথ থাকে। Path copying বা fat node। Persistent segment tree advanced contest-এ।
- How to debug RE / TLE / WA quickly.RE / TLE / WA দ্রুত debug।
✨ Show Answer
RE: array size, NULL deref, div-by-0 — -fsanitize=address। TLE: complexity বা slow I/O। WA: edge case — n=0, n=1, negative, overflow।
- Write a stress test to find bugs.Stress test।
✨ Show Answer
Brute solution + small random input generator + your solution। তিনটি output diff — mismatch হলেই ছোট সাইজে বাগ ধরেছেন।
- Build a personal snippet file with your templates.Personal snippet file।
✨ Show Answer
snippet.c-এ Union-Find, BIT, Sieve, power_mod, fast I/O, graph template... Contest-এ copy-paste।
Glossary (শব্দকোষ)
| Term | Meaning | বাংলায় |
|---|---|---|
| Competitive Programming (CP) | Solving algorithmic problems under time pressure. | সময়ের চাপে algorithmic সমস্যা সমাধান। |
| Online Judge | Site that auto-grades submissions (Codeforces, AtCoder...). | স্বয়ংক্রিয়ভাবে submission যাচাইকারী সাইট। |
| AC (Accepted) | Submission passed all test cases. | সব test pass হয়েছে। |
| WA (Wrong Answer) | Submission produced incorrect output. | ভুল output। |
| TLE | Time Limit Exceeded — too slow. | Time limit ছাড়িয়ে গেছে। |
| MLE | Memory Limit Exceeded. | Memory limit ছাড়িয়ে গেছে। |
| RE | Runtime Error (crash, division by zero). | Runtime crash। |
| CE | Compilation Error. | Compile-time ভুল। |
| Sample I/O | Example test cases shown in the problem. | প্রশ্নে দেওয়া উদাহরণ test। |
| Edge Case | Boundary input (n=0, n=max, all same...). | সীমান্ত-input — যেমন n=0। |
| Stress Testing | Compare brute-force vs fast solution on random inputs. | Random input-এ brute vs fast তুলনা। |
| Template | Reusable starter code with common helpers. | Reusable starter কোড। |
| Fast I/O | Techniques to speed up input/output. | I/O দ্রুত করার কৌশল। |
| Constraints | Limits on n, values, time — drive the algorithm choice. | n, value, time-এর সীমা — algorithm পছন্দে গাইড। |
| ICPC / Codeforces / AtCoder | Major contest venues. | প্রধান contest প্ল্যাটফর্ম। |
Summary — Module 35
Template + Fast I/O + যত্ন করে সমস্যা পড়া + correct-first mindset। Contest জয়ের পথ regular practice-এ।