Submission #1289879

#TimeUsernameProblemLanguageResultExecution timeMemory
1289879dang_hai_longFortune Telling 2 (JOI14_fortune_telling2)C++20
4 / 100
3093 ms580 KiB
#include <bits/stdc++.h>
using namespace std;

class SegmentTree {
public:
    vector<int> tree;
    int n;

    SegmentTree(vector<int>& arr) {
        n = arr.size();
        tree.assign(4 * n, 0);
        if (n > 0) build(1, 0, n - 1, arr);
    }

    void build(int node, int start, int end, vector<int>& arr) {
        if (start == end) {
            tree[node] = arr[start];
            return;
        }
        int mid = (start + end) / 2;
        build(2 * node, start, mid, arr);
        build(2 * node + 1, mid + 1, end, arr);
        tree[node] = max(tree[2 * node], tree[2 * node + 1]);
    }

    int query(int node, int start, int end, int l, int r) {
        if (r < start || end < l) return INT_MIN;
        if (l <= start && end <= r) return tree[node];
        int mid = (start + end) / 2;
        int p1 = query(2 * node, start, mid, l, r);
        int p2 = query(2 * node + 1, mid + 1, end, l, r);
        if (p1 == INT_MIN) return p2;
        if (p2 == INT_MIN) return p1;
        return max(p1, p2);
    }

    int get_max(int l, int r) {
        return query(1, 0, n - 1, l, r);
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, K;
    cin >> N >> K;

    vector<int> Ai(N), Bi(N);
    long long sum = 0;
    for (int i = 0; i < N; i++) {
        cin >> Ai[i] >> Bi[i];
        sum += Ai[i];
    }

    vector<int> T(K);
    for (int i = 0; i < K; i++) {
        cin >> T[i];
    }

    SegmentTree seg(T);

    for (int i = 0; i < N; i++) {
        int current = Ai[i];
        int prev_j = -1;
        while (true) {
            int L = prev_j + 1;
            if (L >= K) break;
            if (seg.get_max(L, K - 1) < current) break;

            int low = L;
            int high = K - 1;
            int ans = -1;
            while (low <= high) {
                int mid = (low + high) / 2;
                if (seg.get_max(L, mid) >= current) {
                    ans = mid;
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            if (ans == -1) break;
            prev_j = ans;
            int other = Ai[i] + Bi[i] - current;
            sum += other - current;
            current = other;
        }
    }

    cout << sum << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...