문제
찬솔이는 블로그를 시작한 지 벌써 $N$일이 지났다.
요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.
찬솔이는 $X$일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.
찬솔이를 대신해서 $X$일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.
입력
첫째 줄에 블로그를 시작하고 지난 일수 $N$와 $X$가 공백으로 구분되어 주어진다.
둘째 줄에는 블로그 시작 $1$일차부터 $N$일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.
출력
첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.
만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.
제한
- $1 \le X \le N \le 250,000$
- $0 \le$ 방문자 수 $\le 8,000$
내 구현
#include <iostream>
#define IO std::cin.tie(NULL), std::ios_base::sync_with_stdio(false)
#define MAX 250000
int A[MAX], N, X;
void solve() {
std::cin >> N >> X;
for (int i = 0; i < N; i++) {
std::cin >> A[i];
if (i != 0) {
A[i] += A[i - 1];
}
}
int sum, max = 0, cnt = 0;
for (int r = X - 1, l; r < N; r++) {
l = r - X + 1;
if (l != 0) {
sum = A[r] - A[l - 1];
} else {
sum = A[r];
}
if (max < sum) {
max = sum;
cnt = 1;
} else if (max == sum) {
cnt++;
}
}
if (max == 0) {
std::cout << "SAD";
} else {
std::cout << max << '\n' << cnt;
}
}
int main() {
IO;
solve();
return 0;
}