C07: Template & Fast I/O¶
Tác giả: FPTOJ Wiki
Chủ đề: Template thi đấu, typedef, macro, tối ưu nhập/xuất
Bạn sẽ học được gì?¶
Sau bài này, bạn có thể:
- Viết template thi đấu chuyên nghiệp
- Dùng
typedefvà#defineđể code nhanh hơn - Tối ưu tốc độ nhập/xuất
1. Template thi đấu¶
flowchart TD
A["#include <bits/stdc++.h>"] --> B["using namespace std;"]
B --> C["typedef & #define"]
C --> D["const INF, MOD"]
D --> E["int main()"]
E --> F["ios_base::sync_with_stdio(false)"]
F --> G["cin.tie(NULL)"]
G --> H["Code bài giải"]
2. typedef — Đặt tên kiểu ngắn¶
| typedef | Kiểu gốc | Ý nghĩa |
|---|---|---|
ll |
long long |
Số nguyên 64-bit |
pii |
pair<int,int> |
Cặp số nguyên |
pll |
pair<ll,ll> |
Cặp số nguyên lớn |
vi |
vector<int> |
Mảng động số nguyên |
vvi |
vector<vector<int>> |
Ma trận động |
3. Macro — Tự động thay thế¶
flowchart LR
A["REP(i, n)"] -->|"Macro expand"| B["for (int i = 0; i < n; i++)"]
C["all(v)"] -->|"Macro expand"| D["(v).begin(), (v).end()"]
E["pb(x)"] -->|"Macro expand"| F["push_back(x)"]
Macro viết tắt¶
Sử dụng macro¶
4. Fast I/O — Tối ưu nhập/xuất¶
Tại sao cần Fast I/O?¶
| Phương thức | Tốc độ | Dùng khi |
|---|---|---|
cin/cout (bật sync) |
Chậm | Debug |
cin/cout (tắt sync) |
Nhanh | Thi đấu |
scanf/printf |
Nhanh | Thi đấu |
getchar/putchar |
Rất nhanh | Cần tốc độ tối đa |
Tắt sync (Luôn dùng trong thi đấu)¶
Lưu ý khi tắt sync
- Không dùng chung
cin/coutvớiscanf/printf - Không dùng
puts/getsvớicout/cin
Fast Input với getchar¶
Đọc số nguyên nhanh — độ phức tạp \(O(\log_{10} n)\) vì xử lý từng chữ số một (số \(n\) có \(\lfloor \log_{10} n \rfloor + 1\) chữ số).
Fast Output với putchar¶
In số nguyên nhanh — cùng độ phức tạp \(O(\log_{10} n)\) vì in từng chữ số.
So sánh Python¶
5. Khi nào dùng gì?¶
| Tình huống | Nên dùng |
|---|---|
| Thi đấu bình thường | cin/cout + tắt sync |
| Input rất lớn (\(>10^6\) số) | scanf/printf hoặc getchar |
| Output rất lớn | printf hoặc putchar |
| Debug | cin/cout (bật sync) |
6. Bài tập thực hành¶
Bài 1: Template hoàn chỉnh¶
Viết chương trình đọc \(n\) số nguyên và in tổng của chúng. Dùng template thi đấu.
Lời giải
Bài 2: Fast I/O vs Normal¶
So sánh tốc độ: đọc \(10^6\) số nguyên bằng cin (có sync) và cin (tắt sync).
Lời giải
Tóm tắt bài học¶
| Nội dung | Chi tiết |
|---|---|
| Template | #include <bits/stdc++.h> + tắt sync |
| typedef | ll, pii, vi — viết ngắn hơn |
| Macro | REP, FOR, all, pb — code nhanh |
| Fast I/O | sync_with_stdio(false) + cin.tie(NULL) |
| Khi nào dùng | Thi đấu: tắt sync. Debug: bật sync |
Bài viết liên quan¶
Bài trước: C06: Hàm trong C++
Bài tiếp theo: C08: Reference & Pointer →