제출 #1290614

#제출 시각아이디문제언어결과실행 시간메모리
1290614dang_hai_long운세 보기 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...