题目描述
两个长度为n的序列a, b,问有多少个区间[l,r]满足如下式子:
即a区间的最大值小于b区间的最小值。
数值范围: n<1e5, aibi<1e9
输入描述
第一行一个整数n
第二行n个数,第i个为ai
第三行n个数,第i个为bi
输出描述
一行一个整数,表示答案
示例
输入
3
3 2 1
3 3 3
输出
3
思路描述
使用枚举法迭代需要三层嵌套的循环,首先遍历l和r,即行和列,然后循环比较[l, r]区间的最大值和最小值,时间复杂度过大。
区间的最大值是其所有子区间的最大值。
代码实现
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
int main() {
// input data
int n; cin >> n;
vector<int> a, b;
for (int i=0;i<n;++i) {
int t; cin >> t;
a.push_back(t);
}
for (int i=0;i<n;++i) {
int t; cin >> t;
b.push_back(t);
}
// dp
int dp_max[n][n], dp_min[n][n]; // vector<vector<int> > dp(n, vector<int>(n,0));
for (int i=0;i<n;++i) {
dp_max[i][i] = a[i];
dp_min[i][i] = b[i];
for (int j=i+1;j<n;++j) {
dp_max[i][j] = max(dp_max[i][j-1], a[j]);
dp_min[i][j] = min(dp_min[i][j-1], b[j]);
}
}
// count
int count = 0;
for (int i=0;i<n;++i)
for (int j=i;j<n;++j)
if (dp_max[i][j] < dp_min[i][j])
count++;
cout << count;
return 0;
}