Untitled
user_9000366
plain_text
8 months ago
2.3 kB
3
Indexable
#include <bits/stdc++.h>
using namespace std;
#define ll long long
void Init() {
ios_base::sync_with_stdio(false),
cin.tie(nullptr),
cout.tie(nullptr);
}
struct SparceTable {
int n, lg;
bool isMin;
vector<vector<int> > sp;
vector<int> bigPow;
int merge(int a, int b) {
return isMin ? min(a, b) : max(a, b);
}
SparceTable(vector<int> &a, bool flag = false) {
isMin = flag;
n = a.size();
lg = __lg(n) + 2;
sp.resize(n, vector<int>(lg));
bigPow.resize(n + 1);
for (int k = 0; k < lg; k++) {
for (int i = 0; i + (1 << k) - 1 < n; i++) {
if (k == 0)
sp[i][k] = a[i];
else
sp[i][k] = merge(sp[i][k - 1], sp[i + (1 << (k - 1))][k - 1]);
}
}
bigPow[1] = 0;
for (int k = 2; k <= n; k++)
bigPow[k] = bigPow[k / 2] + 1;
}
int query(int l, int r) {
int len = r - l + 1;
int k = bigPow[len];
return merge(sp[l][k], sp[r - (1 << k) + 1][k]);
}
};
void solve() {
int n;
cin >> n;
vector<int> a(n), b(n);
for (auto &it: a)cin >> it;
for (auto &it: b)cin >> it;
SparceTable spa(a), spb(b, true);
ll res{};
for (int i = 0; i < n; ++i) {
if (a[i] > b[i])continue;
int st = i, en = n - 1, ansl = n, ansr = -1;
while (st <= en) {
int mid = st + en >> 1;
int dif = spb.query(i, mid) - spa.query(i, mid);
if (dif > 0)
st = mid + 1;
else {
en = mid - 1;
if (!dif)ansl = mid;
}
}
st = i, en = n - 1;
while (st <= en) {
int mid = st + en >> 1;
int dif = spb.query(i, mid) - spa.query(i, mid);
if (dif >= 0) {
st = mid + 1;
if (!dif)ansr = mid;
} else {
en = mid - 1;
}
}
res += max(0, ansr - ansl + 1);
}
cout << res << '\n';
}
int main() {
Init();
solve();
return 0;
}
Editor is loading...
Leave a Comment