Submission #258111

#TimeUsernameProblemLanguageResultExecution timeMemory
258111fedoseevtimofeyFortune Telling 2 (JOI14_fortune_telling2)C++14
4 / 100
3094 ms4596 KiB
#include <iostream> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <set> #include <map> #include <unordered_map> #include <unordered_set> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <random> #include <iomanip> #include <functional> #include <cassert> using namespace std; typedef long long ll; struct SegmentTree { int n; vector <int> t; SegmentTree(int nn) { n = nn; t.resize(4 * n, -1); } void modify(int i, int val, int l, int r, int v) { if (l == r) { t[v] = max(t[v], val); } else { int m = (l + r) >> 1; if (i <= m) modify(i, val, l, m, 2 * v + 1); else modify(i, val, m + 1, r, 2 * v + 2); t[v] = max(t[2 * v + 1], t[2 * v + 2]); } } int get(int ql, int qr, int l, int r, int v) { if (qr < l || r < ql) return -1; if (ql <= l && r <= qr) return t[v]; int m = (l + r) >> 1; return max(get(ql, qr, l, m, 2 * v + 1), get(ql, qr, m + 1, r, 2 * v + 2)); } }; int main() { ios_base::sync_with_stdio(false); cin.tie(0); #ifdef LOCAL freopen("input.txt", "r", stdin); #endif int n, k; cin >> n >> k; vector <int> a(n), b(n); vector <int> c; for (int i = 0; i < n; ++i) { cin >> a[i] >> b[i]; c.push_back(a[i]); c.push_back(b[i]); } vector <int> t(k); for (int i = 0; i < k; ++i) { cin >> t[i]; c.push_back(t[i]); } sort(c.begin(), c.end()); c.resize(unique(c.begin(), c.end()) - c.begin()); for (int i = 0; i < n; ++i) { a[i] = lower_bound(c.begin(), c.end(), a[i]) - c.begin(); b[i] = lower_bound(c.begin(), c.end(), b[i]) - c.begin(); } for (int i = 0; i < k; ++i) { t[i] = lower_bound(c.begin(), c.end(), t[i]) - c.begin(); } int m = c.size(); SegmentTree st(m); for (int i = 0; i < k; ++i) { st.modify(t[i], i, 0, m - 1, 0); } vector <int> when(n, -1); for (int i = 0; i < n; ++i) { int mn = min(a[i], b[i]); int mx = max(a[i], b[i]); if (mn < mx) { when[i] = st.get(mn, mx - 1, 0, m - 1, 0); } } ll ans = 0; for (int i = 0; i < n; ++i) { int st = 0; int go = when[i] + 1; if (when[i] != -1 && b[i] > a[i]) { st = 1; } for (int j = go; j < k; ++j) { if (a[i] <= t[j] && b[i] <= t[j]) { st ^= 1; } } if (st == 0) ans += c[a[i]]; else ans += c[b[i]]; } cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...