求助啊 样例过不了
查看原帖
求助啊 样例过不了
923248
Lian_zy楼主2024/1/21 16:38
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 2e5 + 10;
long long ans;
int n, p, start, mid, lg[maxn], a[maxn][25], b[maxn][25];
int geta(int l, int r) {
	if (l == r) return *a[l];
	p = log2(r - l + 1);
	return max(a[l][p], a[r - (1 << p) + 1][p]);
}
int getb(int l, int r) {
	if (l == r) return *b[l];
	p = log2(r - l + 1);
	return min(b[l][p], b[r - (1 << p) + 1][p]);
}
int search_l(int l, int r) {
	start = l;
	while (l < r) {
		mid = l + r >> 1;
		if (geta(start, mid) >= getb(start, mid)) r = mid;
		else l = mid + 1;
	}
	return l;
}
int search_r(int l, int r) {
	start = l;
	while (l < r) {
		mid = l + r + 1 >> 1;
		if (geta(start, mid) >= getb(start, mid)) l = mid;
		else r = mid - 1;
	}
	return l;
}
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", a[i]);
	for (int i = 1; i <= n; i++) scanf("%d", b[i]);
	for (int j = 1; j <= lg[n]; j++) {
		for (int i = 1; i <= n + 1 - (1 << j); i++) {
			a[i][j] = max(a[i][j - 1], a[i + (1 << j - 1)][j - 1]);
			b[i][j] = min(b[i][j - 1], b[i + (1 << j - 1)][j - 1]);
		}
	}
	for (int i = 1; i <= n; i++) {
		if (*a[i] > *b[i] || geta(i, n) > getb(i, n)) continue;
		ans += search_r(i, n) - search_l(i, n) + 1;
	}
	printf("%d\n", ans);
	return 0;
}

2024/1/21 16:38
加载中...