Submission #1290614

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

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

    SegmentTree(int _n) : n(_n), tree(4 * _n, 0) {}

    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 find_leftmost(int node, int start, int end, int l, int r, int val) {
        if (l > end || r < start) return -1;
        if (l <= start && end <= r) {
            if (tree[node] < val) return -1;
            if (start == end) return start;
            int mid = (start + end) / 2;
            int p1 = find_leftmost(2 * node, start, mid, l, r, val);
            if (p1 != -1) return p1;
            return find_leftmost(2 * node + 1, mid + 1, end, l, r, val);
        }
        int mid = (start + end) / 2;
        int p1 = find_leftmost(2 * node, start, mid, l, r, val);
        if (p1 != -1) return p1;
        return find_leftmost(2 * node + 1, mid + 1, end, l, r, val);
    }
};

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];
    }
    vector<int> T(K);
    for (int i = 0; i < K; i++) {
        cin >> T[i];
    }

    SegmentTree st(K);
    st.build(1, 0, K - 1, T);

    for (int i = 0; i < N; i++) {
        long long current = Ai[i];
        int prev = -1;
        while (true) {
            int next = st.find_leftmost(1, 0, K - 1, prev + 1, K - 1, current);
            if (next == -1) break;
            current = Ai[i] + Bi[i] - current;
            prev = next;
        }
        sum += current;
    }

    cout << sum << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...