给定两个长度为
n
n
n 的数组
b
b
b 和
c
c
c ,下标从
0
0
0 开始
b
i
=
max
(
a
0
,
a
1
,
⋯
,
a
i
)
b_i=\max(a_0,a_1,\cdots,a_i)
bi=max(a0,a1,⋯,ai)
c
i
=
max
(
a
n
−
1
,
a
n
−
2
,
⋯
,
a
i
)
c_i=\max(a_{n-1},a_{n-2},\cdots,a_i)
ci=max(an−1,an−2,⋯,ai)
问可以构造出多少个不同的 a a a , a i a_i ai 是正整数。
答案对 1 0 9 + 7 10^9+7 109+7 取模。
考虑
b
i
>
b
i
−
1
b_{i}> b_{i-1}
bi>bi−1 ,则
a
i
=
b
i
a_{i}=b_{i}
ai=bi ,此时
c
i
≥
b
i
c_i\geq b_i
ci≥bi
考虑
c
i
>
c
i
+
1
c_{i}> c_{i+1}
ci>ci+1,则
a
i
=
c
i
a_i=c_i
ai=ci ,此时
b
i
≥
c
i
b_i\geq c_i
bi≥ci
这里我们还需要特判 b 0 ≤ c 0 b_0\leq c_0 b0≤c0 , b n − 1 ≥ c n − 1 b_{n-1}\geq c_{n-1} bn−1≥cn−1
如果 b i = b i − 1 b_i=b_{i-1} bi=bi−1 且 c i = c i + 1 c_i=c_{i+1} ci=ci+1 ,则 a i ∈ [ 1 , min ( b i , c i ) ] a_i\in [1,\min(b_i,c_i)] ai∈[1,min(bi,ci)], a i a_i ai 共这么多种选择。
时间复杂度: O ( n ) O(n) O(n)
#include
using namespace std;
const int MOD = 1e9 + 7;
int main()
{
int n;
cin >> n;
vector<int> b(n), c(n);
for (int i = 0; i < n; ++i) cin >> b[i];
for (int i = 0; i < n; ++i) cin >> c[i];
if (b.front() > c.front() || b.back() < c.back()) {
cout << "0\n";
return 0;
}
bool ok = true;
int ans = 1;
for (int i = 1; i + 1 < n; ++i) {
if (b[i] > b[i - 1]) {
if (c[i] < b[i]) {
ok = false;
break;
}
} else if (c[i] > c[i + 1]) {
if (c[i] > b[i]) {
ok = false;
break;
}
} else {
ans = 1ll * ans * min(b[i], c[i]) % MOD;
}
}
if (ok) cout << ans << "\n";
else cout << 0 << "\n";
return 0;
}