제출 #1218599

#제출 시각아이디문제언어결과실행 시간메모리
1218599Double_Slash운세 보기 2 (JOI14_fortune_telling2)C++20
100 / 100
342 ms12512 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define all(x) x.begin(), x.end() using pint = pair<int, int>; template <int (*COMB)(int, int)> struct St { int n; vector<int> st; void init(int n) { st.resize((this->n = n) << 1); } void update(int i, int a, int b) { for ((st[i += n] *= a) += b; i >>= 1;) st[i] = COMB(st[i << 1], st[i << 1 | 1]); } int query(int l, int r) { int ret = 0; for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if (l & 1) ret = COMB(ret, st[l++]); if (r & 1) ret = COMB(ret, st[--r]); } return ret; } }; St<[] (int a, int b) { return max(a, b); }> mx; St<[] (int a, int b) { return a + b; }> sum; int main() { int n, q; cin >> n >> q; int A[n], B[n]; for (int i = n; i--;) cin >> A[i] >> B[i]; int ops[q]; for (int &op: ops) cin >> op; vector<int> cc(ops, ops + q); sort(all(cc)); cc.erase(unique(all(cc)), cc.end()); mx.init(cc.size()); auto idx = [&] (int i) { return lower_bound(all(cc), i) - cc.begin(); }; for (int i = 0; i < q; ++i) mx.update(idx(ops[i]), 0, i + 1); vector<int> queries[q + 1]; for (int i = n; i--;) { int j = mx.query(idx(min(A[i], B[i])), idx(max(A[i], B[i]))); if (j and A[i] < B[i]) swap(A[i], B[i]); queries[j].emplace_back(i); } sum.init(cc.size()); ll ans = 0; for (int i = q; i >= 0; --i) { if (i < q) sum.update(idx(ops[i]), 1, 1); for (int j: queries[i]) ans += sum.query(idx(max(A[j], B[j])), cc.size()) & 1 ? B[j] : A[j]; } cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...