Submission #1289879

#TimeUsernameProblemLanguageResultExecution timeMemory
1289879dang_hai_long운세 보기 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...