First, a bit of notation. Given a sequence $a_1, a_2, \ldots a_n$ (little $n$,
not the whole sequence $N$), call the *sliding window minimums* the
sequence of length $\max(0, n - K + 1)$ given by

$$ \{\min(a_1, a_2, \ldots , a_K), \min(a_2, a_3, \ldots , a_{K+1}), \ldots \min(a_{n - K + 1}, a_{n - K + 2}, \ldots , a_n) \} $$

When approaching a question like this, it is often helpful to consider simpler cases. We now consider the following problem: how many ways are there to obtain sliding window minimums of

$$\underbrace{v, v, \ldots, v}_{N - K + 1 \text{ times }}?$$

Let $MX = 10^9$, and let $x = MX - v$. Let $DP[u]$ be the number of length $u$ sequences with sliding window minimums equal to $v$ that end with $v$. Then by casework on the rightmost element equal to $v$, we get

$$DP[v] = DP[v-1] + xDP[v-2] + \ldots + x^{K - 1}DP[v - K].$$

Note here that $x$
represents the number of values that are strictly larger than $v$. While this
yields a direct $O(NK)$ solution, we can do better: observe that
$$DP[v+1] = DP[v] + x(DP[v] - x^{K - 1}DP[v - K]).$$

This recurrence yields an $O(N)$ solution. Let $c(mn, v)$ be the number of sequences of length $v$ with sliding window minima all equal to $v$.

Now that we've done the simple case, let's consider the problem in general. Assume that two adjacent values of the sliding window minimums are different, and that without loss of generality the left one is larger than the right one, that is,

$$a = \min(a_i, a_{i + 1}, \ldots , a_{i + K - 1}) > \min(a_{i+1}, a_{i+2}, \ldots , a_{i + K}) = b$$

Since
$a = \min(a_i, a_{i + 1}, \ldots , a_{i + K - 1}) \le \min(a_{i + 1}, a_{i + 2}, \ldots , a_{i + K - 1})$,
this means that $a_{i + K} = b$.
This indicates that when we have two adjacent sliding window minima that are different, we can immediately conclude the value of some element. This observation leads to the idea of representing the sliding window minima as a sequence $(\text{value}, \text{count})$ pairs. For example, $(5, 3, 3, 3, 3, 2) \mapsto ((5, 1), (3, 4), (2, 1))$.

The next step is perhaps best explained with an example. Take $K = 2$, and assume that the sliding window minima are $(2, 2, 2, 3, 3, 3, 1, 1)$. Then, by the above observation the sequence must be of the form $(a, b, 2, c, d, e, f, 1, g)$. Now, the sequence $c, d, e, f$ must have sliding window minima all threes, the sequence $a, b$ must have sliding window minima all twos, and the sequence $g$ must have sliding window minima all $1$s. Therefore, to count the number of possible sequences, it suffices to find $c(3, 4) \times c(2, 2) \times c(1, 1)$.

If we change the sequence, things are slightly different, but we can find formulas corresponding to the len's which are written below. Two points are tricky. One is the ends, and the other is that ranges which are surrounded by two larger ranges are a bit subtle.

My solution is below:

#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pi; typedef long long ll; typedef vector<int> vi; #define mp make_pair #define sz(x) (int)x.size() #define pb push_back #define f first #define s second const int MOD = 1000000007; const int MX = 1000000000; int ad(int a, int b, int mod = MOD) { return (a+b)%mod; } int sub(int a, int b, int mod = MOD) { return (a-b+mod)%mod; } int mul(int a, int b, int mod = MOD) { return ((ll)a*b)%mod; } int AD(int& a, int b, int mod = MOD) { return a = ad(a,b,mod); } int SUB(int& a, int b, int mod = MOD) { return a = sub(a,b,mod); } int MUL(int& a, int b, int mod = MOD) { return a = mul(a,b,mod); } int countseq(int mnval, int K, int len){ //count the number of sequences of length len such that every group of K has minimum mnval. int succ = MX - mnval; int DP[len + 2]; int pows[K + 1]; int powslow[K + 1]; pows[0] = 1; powslow[0] = 1; for (int i = 1; i <= K; i++){ pows[i] = mul(pows[i - 1], succ + 1); powslow[i] = mul(powslow[i - 1], succ); } DP[0] = 1; DP[1] = 1; for (int i = 2; i <= min(K, len); i++){ //values for DP[i]. DP[i] = pows[i - 1]; } if (len < K){ return pows[len]; } for (int i = K; i <= len; i++){ DP[i + 1] = DP[i]; SUB(DP[i + 1], mul(DP[i - K], powslow[K - 1])); MUL(DP[i + 1], succ); AD(DP[i + 1], DP[i]); } return DP[len + 1]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int N, K; cin >> N >> K; vi in(N - K + 1); for (int i = 0; i < N - K + 1; i++){ cin >> in[i]; } //create (value, cnt) pairs. vector<pi> comp; int cur = -1; int cnt = 0; for (int i = 0; i < N - K + 1; i++){ if (cur == in[i]){ ++cnt; } else{ if (cnt) comp.pb(mp(cur, cnt)); cur = in[i]; cnt = 1; } } comp.pb(mp(cur, cnt)); if (comp.size() == 1){ //this case is special, so let's lay it rest right here. cout << countseq(comp[0].f, K, N) << endl; } else{ int res = 1; for (int i = 0; i < sz(comp); i++){ int a = comp[i].f; int len; if (i == 0){ if (comp[1].f > comp[0].f){ len = comp[0].s - 1; } else{ len = comp[0].s + K - 1; } } else if (i == sz(comp) - 1){ if (comp[i - 1].f > comp[i].f){ len = comp[i].s - 1; } else{ len = comp[i].s + K - 1; } } else{ if (comp[i - 1].f > comp[i].f){ if (comp[i + 1].f > comp[i].f){ //tricky! len = max(0, comp[i].s - K - 1); } else{ len = comp[i].s - 1; } } else{ if (comp[i + 1].f > comp[i].f){ len = comp[i].s - 1; } else{ len = comp[i].s + K - 1; } } } MUL(res, countseq(a, K, len)); } cout << res << endl; } }