当长为 len 的平均数等于 k 时,代表区间的和为 len*k ,特别的,当 k 为 0 时,区间的和也为0,代表 sum[r] == sum[l-1] ,所以我们可以先简化题意,将每一项都减去 k ,来求区间平均数为 0 的最长区间,那么对于每个区间前缀和 sum ,一定是和之前值等于 sum ,且下标最小的一项构成最长区间,所以我们可以使用 map 维护每个前缀和值最早出现的下标,如果一个前缀和之前出现过,就用他们两个的下标来更新答案,最后维护最大的答案即可
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 2e5 + 5; int __t = 1, n, k, x; void solve() { cin >> n >> k; int sum = 0, ans = -1; map<int, int> mp; mp[0] = 0; for (int i = 1; i <= n; i++) { cin >> x; sum += x - k; if (mp.count(sum)) ans = max(ans, i - mp[sum]); else mp[sum] = i; } cout << ans << '\n'; return; } int32_t main() { #ifdef ONLINE_JUDGE ios::sync_with_stdio(false); cin.tie(0); #endif // cin >> __t; while (__t--) solve(); return 0; }