Luyện đề Cấu trúc dữ liệu – Minh Tâm (T4 28/10/2026)

Cộng đoạn, tổng đoạn

Nộp bài
Time limit: 1.0 / Memory limit: 256M

Point: 100

📖 Bài giảng & lời giải: đây là Bài tập 8 trong bài giảng Bài 31: Fenwick, Segment Tree trên blog Lập trình thuật toán – có lý thuyết, mô phỏng từng bước, gợi ý và code C++ / Python.

⚠️ Lưu ý: hãy đảm bảo em đã thật sự cố gắng tự làm bài trước, rồi mới xem gợi ý và lời giải nhé!

🎓 Khóa học Lập trình Thuật toán thi đấu của thầy Nguyễn Việt Nam Sơn – 111 buổi video, kèm cặp cá nhân, luyện thi chuyên Tin · HSG Tin học · Tin học trẻ · đội tuyển quốc gia · Olympic/ICPC. 👉 Xem chi tiết khóa học · Thành tích học viên

📞 Đăng ký học: Zalo 0767 666 702 · Facebook Nguyễn Việt Nam Sơn · 🌐 laptrinhthuattoan.blogspot.com


Cho dãy $n$ số nguyên $a_1, a_2, \ldots, a_n$. Có $q$ thao tác theo thứ tự, mỗi thao tác thuộc một trong hai loại:

  • 1 l r x: cộng $x$ vào mọi phần tử $a_l, a_{l+1}, \ldots, a_r$;
  • 2 l r: in ra tổng $a_l + a_{l+1} + \cdots + a_r$ hiện tại.

Dữ liệu vào

  • Dòng 1: hai số nguyên $n, q$ ($1 \le n, q \le 2 \cdot 10^5$).
  • Dòng 2: $n$ số nguyên $a_1, a_2, \ldots, a_n$ ($|a_i| \le 10^9$).
  • $q$ dòng tiếp theo, mỗi dòng là một thao tác dạng 1 l r x ($1 \le l \le r \le n$, $|x| \le 10^6$) hoặc 2 l r ($1 \le l \le r \le n$).

Dữ liệu bảo đảm có ít nhất một thao tác loại 2.

Kết quả

Với mỗi thao tác loại 2, theo đúng thứ tự, in ra tổng tìm được trên một dòng (chú ý kết quả có thể vượt quá phạm vi kiểu int).

Sample Input

8 3
3 1 4 1 5 9 2 6
1 2 7 2
2 4 5
2 1 8

Sample Output

10
43

Bật tắt đèn (cây phân đoạn)

Nộp bài
Time limit: 1.0 / Memory limit: 256M

Point: 100

📖 Bài giảng & lời giải: đây là Bài tập 6 trong bài giảng Bài 37: Sparse Table, Lazy trên blog Lập trình thuật toán – có lý thuyết, mô phỏng từng bước, gợi ý và code C++ / Python.

⚠️ Lưu ý: hãy đảm bảo em đã thật sự cố gắng tự làm bài trước, rồi mới xem gợi ý và lời giải nhé!

🎓 Khóa học Lập trình Thuật toán thi đấu của thầy Nguyễn Việt Nam Sơn – 111 buổi video, kèm cặp cá nhân, luyện thi chuyên Tin · HSG Tin học · Tin học trẻ · đội tuyển quốc gia · Olympic/ICPC. 👉 Xem chi tiết khóa học · Thành tích học viên

📞 Đăng ký học: Zalo 0767 666 702 · Facebook Nguyễn Việt Nam Sơn · 🌐 laptrinhthuattoan.blogspot.com


Có một dãy $n$ bóng đèn, trạng thái ban đầu cho bằng một xâu nhị phân độ dài $n$: ký tự thứ $i$ là 1 nếu bóng $i$ đang sáng, 0 nếu đang tắt. Có $q$ thao tác, mỗi thao tác thuộc một trong hai loại:

  • 1 l r: bấm công tắc mọi bóng từ $l$ tới $r$ (bóng sáng thành tắt, bóng tắt thành sáng);
  • 2 l r: in số bóng đang sáng trong đoạn $[l, r]$.

Dữ liệu vào

  • Dòng 1: hai số nguyên $n, q$ ($1 \le n, q \le 10^5$).
  • Dòng 2: xâu nhị phân độ dài $n$.
  • $q$ dòng tiếp theo, mỗi dòng là một thao tác dạng 1 l r hoặc 2 l r ($1 \le l \le r \le n$).

Kết quả

Với mỗi thao tác loại 2, in kết quả trên một dòng. Dữ liệu bảo đảm có ít nhất một thao tác loại 2.

Sample Input

6 5
101100
2 1 6
1 1 4
2 1 6
1 3 6
2 2 5

Sample Output

3
1
4

Đếm cặp XOR nhỏ hơn k

Nộp bài
Time limit: 1.0 / Memory limit: 256M

Point: 100

📖 Bài giảng & lời giải: đây là Bài tập 8 trong bài giảng Bài 39: Z, Manacher, Trie trên blog Lập trình thuật toán – có lý thuyết, mô phỏng từng bước, gợi ý và code C++ / Python.

⚠️ Lưu ý: hãy đảm bảo em đã thật sự cố gắng tự làm bài trước, rồi mới xem gợi ý và lời giải nhé!

🎓 Khóa học Lập trình Thuật toán thi đấu của thầy Nguyễn Việt Nam Sơn – 111 buổi video, kèm cặp cá nhân, luyện thi chuyên Tin · HSG Tin học · Tin học trẻ · đội tuyển quốc gia · Olympic/ICPC. 👉 Xem chi tiết khóa học · Thành tích học viên

📞 Đăng ký học: Zalo 0767 666 702 · Facebook Nguyễn Việt Nam Sơn · 🌐 laptrinhthuattoan.blogspot.com


Cho dãy $n$ số nguyên không âm $a_1, a_2, \ldots, a_n$ và số nguyên $k$. Hãy đếm số cặp chỉ số $(i, j)$ với $1 \le i \lt j \le n$ và $a_i \oplus a_j \lt k$ (trong đó $\oplus$ là phép XOR theo bit).

Dữ liệu vào

  • Dòng 1: hai số nguyên $n, k$ ($1 \le n \le 10^5$, $1 \le k \le 2^{30}$).
  • Dòng 2: $n$ số nguyên $a_1, a_2, \ldots, a_n$ ($0 \le a_i \lt 2^{30}$).

Kết quả

In ra một số nguyên là số cặp thoả mãn (kết quả có thể vượt kiểu int).

Sample Input

5 3
1 2 3 4 5

Sample Output

3

Bàn bật nảy

Nộp bài
Time limit: 1.0 / Memory limit: 256M

Point: 100

📖 Bài giảng & lời giải: đây là Bài tập 8 trong bài giảng Bài 38: Chia căn, thuật toán Mo trên blog Lập trình thuật toán – có lý thuyết, mô phỏng từng bước, gợi ý và code C++ / Python.

⚠️ Lưu ý: hãy đảm bảo em đã thật sự cố gắng tự làm bài trước, rồi mới xem gợi ý và lời giải nhé!

🎓 Khóa học Lập trình Thuật toán thi đấu của thầy Nguyễn Việt Nam Sơn – 111 buổi video, kèm cặp cá nhân, luyện thi chuyên Tin · HSG Tin học · Tin học trẻ · đội tuyển quốc gia · Olympic/ICPC. 👉 Xem chi tiết khóa học · Thành tích học viên

📞 Đăng ký học: Zalo 0767 666 702 · Facebook Nguyễn Việt Nam Sơn · 🌐 laptrinhthuattoan.blogspot.com


Có $n$ ô xếp thành một hàng, đánh số từ $1$ tới $n$. Ô thứ $i$ có một lò xo độ mạnh $a_i$ ($a_i \ge 1$): viên bi rơi vào ô $i$ sẽ bật sang ô $i + a_i$; nếu chỉ số này vượt quá $n$ thì bi rời khỏi bàn. Có $q$ thao tác, mỗi thao tác thuộc một trong hai loại:

  • 0 i x: đổi độ mạnh lò xo ở ô $i$ thành $x$;
  • 1 i: thả một viên bi vào ô $i$; in ra ô cuối cùng viên bi chạm vào trước khi rời bàn và số lần bật (tính cả lần bật ra khỏi bàn).

Dữ liệu vào

  • Dòng 1: hai số nguyên $n, q$ ($1 \le n, q \le 10^5$).
  • Dòng 2: $n$ số nguyên $a_1, a_2, \ldots, a_n$ ($1 \le a_i \le n$).
  • $q$ dòng tiếp theo, mỗi dòng là một thao tác dạng 0 i x ($1 \le i \le n$, $1 \le x \le n$) hoặc 1 i ($1 \le i \le n$).

Kết quả

Với mỗi thao tác loại 1, in trên một dòng hai số nguyên cách nhau một dấu cách: chỉ số ô cuối cùng bi chạm vào và số lần bật. Dữ liệu bảo đảm có ít nhất một thao tác loại 1.

Sample Input

8 4
1 2 1 3 1 2 1 1
1 1
0 4 5
1 1
1 6

Sample Output

8 5
4 3
8 2