我看了下这道题目,发现大家普遍使用的是ST和二分,然而实际不需要这么麻烦,这道题由于数据量并不是太大,只有1e6的数据量,因此可以使用线性判断加上剪枝,将这道题优化到一个非常简单的地步
#include<bits/stdc++.h>
using namespace std;
int n, ans = 0;
const int N = 1e6 + 10;
int a[N], b[N];
bool st[N];
int main( )
{
cin >> n;
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i ++){
scanf("%d", &b[i]);
if(a[i] > b[i]) st[i] = true;
}
int maxa, minb;
for(int i = 1; i <= n; i ++)
{
maxa = -1, minb = 0x3f3f3f3f;
for(int j = i; j <= n; j ++)
{
maxa = max(maxa, a[j]);
minb = min(minb, b[j]);
if(maxa == minb) ans ++;
else if(st[j]) break;
}
}
cout << ans;
return 0;
}