import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), k = sc.nextInt();
long pre = 0, cur;
Map<Long, Integer> map = new HashMap<>();
map.put(0L, 0);
int ans = -1;
for (int i = 1; i <= n; i++) {
cur = pre + sc.nextInt() - k;
if (map.containsKey(cur)) ans = Math.max(ans, i - map.get(cur));
else map.put(cur, i);
pre = cur;
}
System.out.println(ans);
}
} #include <bits/stdc++.h>
#include <iostream>
using namespace std;
int main(){
int n ,k;
cin >>n >>k;
vector<int> a(n,0);
for(int i = 0; i < n; i++){
cin>>a[i];
}
unordered_map<long, int> ump;
ump[0] = -1;
int start = 0;
long long sum = 0;
int maxlen = -1;
for(int i = 0; i < a.size(); i++){
sum += a[i] - k;
if(ump.find(sum ) != ump.end()){
maxlen = max(maxlen, i- ump[sum]);
}else{
ump[sum] = i;
}
}
cout<<maxlen<<endl;
return 0;
} #include<bits/stdc++.h>
#include <unordered_map>
using namespace std;
// 平均数不好处理,每个数减k转化为计算和为0的最长子数组
int main() {
int a, b;
while (cin >> a >> b) { // 注意 while 处理多个 case
vector<int> nums(a);
int res = -1;
long long sum = 0;
for (int i = 0; i < a; ++i) {
cin >> nums[i];
nums[i] -= b;
}
unordered_map<long long, int> mp;
mp[0] = -1;
for (int i = 0; i < nums.size(); ++i) {
sum += nums[i];
if (mp.count(sum)) {
res = max(res, i - mp[sum]);
}
if (!mp.count(sum)) {
mp[sum] = i;
}
}
cout << res;
}
} #include <iostream>
#include<map>;
using namespace std;
int main() {
/*
思路:
1.既然要求平均数为k,只需把所有元素减去k,若一些元素和为0即说明这些元素平均数为k
2.使用map<sum,i>表示前i个位置的和
3.遍历元素进行求和。
当出现不存在的sum时进行记录
当出现已存在的sum时,假设此时下标为j,记录sum下标为i
则说明在(i+1,j)这一段所有元素的和为0,即其平均数是k,是符合要求的
4.找出最长的子数组即可
*/
long n,k;
cin>>n>>k;
int res = -1;
map<long long,int> sumMp;
sumMp[0] = 0;
long long sum = 0;
long ai;
for(int i = 1; i <= n; i++)
{
cin >> ai;
sum += ai-k;
if(sumMp.count(sum))
{
res = max(res, i - sumMp[sum]);
}
else
{
sumMp[sum] = i;
}
}
cout<<res;
return 0;
}
// 64 位输出请用 printf("%lld") import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), k = sc.nextInt(), ans = -1;
long res = 0;
int[] a = new int[n+5];
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
}
Map<Long, Integer> b = new HashMap<>();
b.put(0L, 0);
for (int i = 1; i <= n; i++) {
res += a[i] - k;
if (b.containsKey(res)) {
ans = Math.max(ans, i - b.get(res));
} else {
b.put(res, i);
}
}
System.out.print(ans);
}
} import java.util.*;
import java.io.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] str = bf.readLine().split(" ");
int n = Integer.parseInt(str[0]);
long k = Long.parseLong(str[1]);
str = bf.readLine().split(" ");
//多个元素的平均数为k,那么对每个元素都-k,得到的元素之和一定为0,即子数组之和为0
//子数组之和为0,那么对应的前缀和数组sum,一定有两个下标ij,sum[i]==sum[j]
long[] nums = new long[n];
for(int i=0;i<n;i++){
nums[i]=Long.parseLong(str[i])-k;
}
long[] sums = new long[n+1];
Map<Long, List<Integer>> sum2Index = new HashMap<>();
for(int i=1;i<=n;i++){
sums[i]=sums[i-1]+nums[i-1];
List<Integer> oldValue = sum2Index.computeIfAbsent(sums[i], e->new ArrayList<>());
oldValue.add(i);
}
//System.out.println(sum2Index);
int res =-1;
for(Long sum : sum2Index.keySet()){
if(sum==0){//如果前缀和为0,那么[0,i]就是一个满足条件的结果了
int curr = Collections.max(sum2Index.get(sum));
res=Math.max(res, curr);
continue;
}
if(sum2Index.get(sum).size()>=2){
List<Integer> list = sum2Index.get(sum);
int min=list.get(0);
int max = list.get(0);
for(int i=0;i<list.size();i++){
min = Math.min(min, list.get(i));
max = Math.max(max, list.get(i));
}
res=Math.max(res, (max-min));
}
}
System.out.println(res);
}
}