Untitled
user_9000366
plain_text
6 days ago
2.3 kB
1
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