# Lời giải Tuyển sinh 10 trường THPT chuyên Khoa học Tự nhiên - Môn Tin học
Chấm bài tại đây: [ClueOJ](https://oj.clue.edu.vn/contest/khtn_ts10_25).
## Bài 1. Điểm
### Tóm tắt đề bài
Cho $n$ đội, đội thứ $i$ có chỉ số sức bền $m_i$ và sức mạnh $v_i$. Tổng sức $t_i$ của đội $i$ là $m_i$ + $v_i$. Hãy tìm chênh lệch giữa đội có tổng sức lớn nhất và đội có tổng sức bé nhất.
### Lời giải
Ta tính ra mảng $t_i$ là tổng sức của đội thứ $i$. Ta sắp xếp mảng lại.
Kết quả sau khi sắp xếp mảng tăng dần sẽ là $t_n - t_1$.
Ta cũng có thể lặp hai lần để tìm đội có tổng sức lớn nhất và bé nhất, sau đó lấy hiệu.
Độ phức tạp: $O$ ($n \times log$ $n$) hoặc $O$ ($n$).
## Bài 2. Số dư
### Tóm tắt đề bài
Cho số nguyên dương $n$. Hãy tính số dư của $2^{3^n}$ khi chia cho $5$.
### Lời giải
Ta thấy:
- $2^0$ chia $5$ dư $1$.
- $2^1$ chia $5$ dư $2$.
- $2^2$ chia $5$ dư $4$.
- $2^3$ chia $5$ dư $3$.
- $2^4$ chia $5$ dư $1$.
- ...
Vì vậy ta cần quan tâm tới số dư khi chia $3^n$ cho $4$.
- Với $n$ chẵn, $3^n$ sẽ là số chính phương, mà số chính phương lẻ chia $4$ luôn dư $1$. Vì vậy, $2^{3^n}$ chia $5$ dư $2$.
- Ngược lại, với $n$ lẻ, $3^n$ chia $4$ dư $1 \times 3 = 3$. Vì vậy, $2^{3^n}$ chia $5$ dư $3$.
Độ phức tạp: $O$ ($1$).
## Bài 3. Khoảng cách ngắn nhất
### Tóm tắt đề bài
Cho mảng $a$ gồm $n$ phần tử. Hãy tìm khoảng cách ngắn nhất giữa mọi cặp phần tử bằng nhau trong mảng. Nói cách khác, hãy tìm $min$ $(|i - j|)$ với mọi $1 \le i < j \le n$ và $a_i = a_j$.
### Subtask 1. $n \le 10^3$
Sử dụng hai vòng lặp, nếu $a_i = a_j$ thì cập nhật kết quả với $|i - j|$.
Độ phức tạp: $O$ ($n^2$).
### Subtask 2. $n \le 10^5$
Nhận xét: Với mọi $a_j$ ta cần quan tâm tới $a_i = a_j$ và với $i$ lớn nhất có thể.
Vì vậy, trong quá trình duyệt, ta sẽ lưu vị trí sau cùng ta gặp phần tử có giá trị là $x$ nào đó. Điều này có thể thực hiện với $map$. Hoặc cũng có thể nén số lại do ta chỉ quan tâm tính lớn bé của các phần tử, sau đó sử dụng mảng đánh dấu.
Độ phức tạp: $O$ ($n \times log$ $n$).
## Bài 4. Hình chữ nhật
### Tóm tắt đề bài
Cho $n$ hình chữ nhật, mỗi hình có chiều dài là $d_i$ và chiều rộng là $r_i$.
Hình chữ nhật $A$ được định nghĩa là lớn hơn hình chữ nhật $B$ khi:
- Hoặc diện tích hình chữ nhật $A$ lớn hơn.
- Hoặc nếu diện tích bằng nhau, chiều dài hình chữ nhật $A$ lớn hơn chiều dài hình chữ nhật $B$.
Hãy tìm độ dài của dãy giảm dài nhất (không cần liên tiếp) của các hình chữ nhật.
### Subtask 1. $n \le 10^3$
Gọi $dp[i]$ là dãy hình chữ nhật giảm dài nhất, khi xét tới hình chữ nhật thứ $i$ và ta có chọn hình chữ nhật thứ $i$.
Ta có công thức truy hồi:
- $dp[i] = 1$ (cơ sở, dãy một hình chữ nhật luôn thỏa mãn).
- $dp[i] = max (dp[i], dp[j] + 1)$ nếu thỏa mãn một trong các điều sau:
- $area[j] > area[i]$ với $area[x]$ là diện tích hình chữ nhật thứ $x$.
- $d[j] > d[i]$.
Kết quả sẽ là $max$ của mảng $dp$.
Độ phức tạp: $O$ ($n^2$).
### Subtask 2. $n \le 10^5$.
Ta sẽ đánh chỉ số các hình chữ nhật theo cách thỏa mãn: gọi $a[i]$ là chỉ số của hình chữ nhật thứ $i$, nếu hình chữ nhật thứ $i$ lớn hơn hình chữ nhật thứ $j$, thì $a[i] < a[j]$.
Nếu đánh số được theo cách này, bài toán sẽ là bài [Dãy con tăng dài nhất](https://blog.vietcodes.com/algo/lis).
Ta sẽ sắp xếp lại các hình chữ nhật theo đề bài. Sau đó, chỉ số của hình chữ nhật thứ $i$ sẽ chính là vị trí của hình chữ nhật đó trong dãy đã sắp xếp. Cần cẩn thận tránh trường hợp có hai hình chữ nhật bằng nhau.
Độ phức tạp: $O$ ($n \times log$ $n$).