前缀和计算起点坐标到终点的矿石个数,贪心可知最多折返一次,且折返路径的长度一定小于另一方向路径的长度,枚举 1)从左边折返 2)从右边折返 的最大答案,复杂度 O(m).
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int n, m, ans;
int l[N], r[N];
void solve() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
if (x >= 0) r[x] ++;
else l[-x] ++;
}
for (int i = 0; i < m; i++) {
l[i + 1] += l[i];
r[i + 1] += r[i];
}
for (int x = 0; x <= m / 3; x++) {
ans = max(ans, l[x] + r[m - 2 * x]);
ans = max(ans, r[x] + l[m - 2 * x]);
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
solve();
return 0;
}