Untitled

 avatar
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