区间贪心算法,注意可以直接用求和公式算出来
#include <iostream>
//3
//3 2 1
//3 3 3
using namespace std;
int a[100020];
int b[100020];
int n;
int func(int x) {
return (x * (x + 1)) / 2;
}
// 以当前点为起点的区间扩展遍历法
int main() {
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
cin >> b[i];
int ans = 0;
for (int i = 0; i < n; i++) {
int maxn = a[i];
int minn = b[i];
if (maxn >= minn) continue;
int len = 1;
for (int j = i + 1; j < n; j++) {
if (maxn < a[j]) maxn = a[j];
if (minn > b[j]) minn = b[j];
if (maxn >= minn) break; // 直到不满足条件退出当前循环
len++;
}
i = i + len; // 已当前 i点为起点的区间寻找已经扩展完, 可以跳过len 个元素
ans += func(len);
}
cout << ans << endl;
return 0;
}