非常好签到题。

对 \(a_i\) 升序排序,枚举同色段 \([l,r]\) 并钦定 \([l,r]\) 是最后相等的那个颜色。只有 \([1,l)\) 中的数能操作到相等,且优先操作一段后缀。

对分界点进行二分,做前缀和判定即可。复杂度 \(O(n \log n)\)。

#define int long long
const int N = 5e5 + 5;
int n, m, a[N], s[N];void _main() {cin >> n >> m;for (int i = 1; i <= n; i++) cin >> a[i];sort(a + 1, a + n + 1);for (int i = 1; i <= n; i++) s[i] = s[i-1] + a[i];int res = 1;for (int i = 1, j; i <= n; i = j) {for (j = i; a[i] == a[j]; ) j++;int lo = 1, hi = i-1, p = i;while (lo <= hi) {int mid = (lo + hi) >> 1;if (s[i-1] - s[mid-1] + m >= a[i] * (i-mid)) p = mid, hi = mid-1;else lo = mid+1;}chkmax(res, j - p);}cout << res;
}