

Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
\begin{array}{c} \color{#FFFFFFff}{H}\color{#E7E7E7ff}{o}\color{#CFCFCFff}{r}\color{#B7B7B7ff}{i}\color{#9F9F9Fff}{z}\color{#878787ff}{o}\color{#6F6F6Fff}{n} \end{array} $\\$
// Horizon
#include <bits/stdc++.h>
#define ll long long
#define ft(i, l, r, d) for (int i = l; i < r; i += d)
#define fd(i, r, l, d) for (int i = r; i > l; i -= d)
#define ftf(i, l, r, d) for (int i = l; i <= r; i += d)
#define fdf(i, r, l, d) for (int i = r; i >= l; i -= d)
#define pb push_back
#define mp make_pair
#define all(x) x.begin(), x.end()
#define endl '\n'
#define File(name) freopen(name".INP", "r", stdin); freopen(name".OUT", "w", stdout);
using namespace std;
int a[2001], t[2001], save[2001][2001], len[2001];
int main() {
//File("KHOBAU");
int n, k; cin >> n >> k;
ft(i, 0, n, 1) {
cin >> a[i];
t[i] = a[i];
}
sort(a, a + n);
int rw = 0, cl = 0, l = 0, kq = 0, m = 0;
ft(r, 0, n, 1) {
if (a[r] - a[l] > k) {
cl++;
l = r;
}
save[cl][len[cl]] = a[r];
len[cl]++;
}
ftf(i, 0, cl, 1)
if (len[i] > kq) {
kq = len[i];
m = i;
}
cout << kq << '\n';
ft(i, 0, n, 1)
ft(j, 0, kq, 1)
if (t[i] == save[m][j])
cout << t[i] << " ";
}
Ý tưởng: Dùng kĩ thuật 2 con trỏ và cửa sổ trượt.
+ Đầu tiên lưu lại mảng `a` vào mảng `t` để giữ vị trí các số
+ Sắp xếp lại `a`
+ Dùng kĩ thuật 2 con trỏ, nếu `L, R` thỏa mãn sẽ lưu các phần tử vào mảng 2 chiều `"save"`
+ Nếu `a[R] - a[L] > k` thì ta sẽ chuyển sang cột mới của mảng 2 chiều và dùng cửa sổ trượt để loại dần phần tử bên tay trái
+ Cuối cùng sẽ tìm vị trí của cột có nhiều phần tử nhất, và in ra các phần tử đó theo thứ tự trong mảng `t`
`"PS"`: Theo mình nghĩ là test mẫu sai vì số lớn nhất là `16` và nhỏ nhất là `5` thì có khoảng cách là `11 > k` nên không thỏa mãn.
Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin