Submission #1293031

#TimeUsernameProblemLanguageResultExecution timeMemory
1293031tormentFortune Telling 2 (JOI14_fortune_telling2)C++20
0 / 100
2 ms580 KiB
#include <bits/stdc++.h> using namespace std; /// https://codeforces.com/blog/entry/12781?#comment-175184 bool cmp(array<int, 2>a, array<int, 2>b){ return max(a[0], a[1]) < max(b[0], b[1]); } struct SegmentTree{ vector<int>sTree; SegmentTree(int n){ sTree.resize(4 * n); } void Build(int node, int l, int r, vector<int>&v){ if(l == r){ sTree[node] = v[l]; } else{ int mid = (l + r) / 2; Build(node * 2, l, mid, v); Build(node * 2 + 1, mid + 1, r, v); sTree[node] = max(sTree[node * 2], sTree[node * 2 + 1]); } } int Query(int node, int l, int r, int ql, int qr){ if(ql > r || l > qr){ return 0; } if(ql <= l && r <= qr){ return sTree[node]; } int mid = (l + r) / 2; int lc = Query(node * 2, l, mid, ql, qr); int rc = Query(node * 2 + 1, mid + 1, r, ql, qr); return max(lc, rc); } }; struct BIT{ vector<int>fen; int sz; BIT(int n){ fen.resize(n + 1); sz = n; } void Update(int pos, int val){ while(pos <= sz){ fen[pos] += val; pos += (pos & -pos); } } int Sum(int pos){ int s = 0; while(pos > 0){ s += fen[pos]; pos -= (pos & -pos); } return s; } }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, q; cin >> n >> q; vector<array<int, 2>>v(n), ev; vector<int>t(q + 1), compress = {-1}; vector<int>pos(2 * n + q); for(int i = 0;i < n;++i){ cin >> v[i][0] >> v[i][1]; compress.push_back(v[i][0]); compress.push_back(v[i][1]); } for(int i = 1;i <= q;++i){ cin >> t[i]; compress.push_back(t[i]); } sort(compress.begin(), compress.end()); compress.erase(unique(compress.begin(), compress.end()), compress.end()); for(int i = 0;i < n;++i){ int p = lower_bound(compress.begin(), compress.end(), v[i][0]) - compress.begin(); v[i][0] = p; p = lower_bound(compress.begin(), compress.end(), v[i][1]) - compress.begin(); v[i][1] = p; } for(int i = 1;i <= q;++i){ int p = lower_bound(compress.begin(), compress.end(), t[i]) - compress.begin(); t[i] = p; pos[t[i]] = max(pos[t[i]], i); ev.push_back({t[i], i}); } sort(ev.begin(), ev.end()); sort(v.begin(), v.end(), cmp); SegmentTree tree(2 * n + q); tree.Build(1, 1, 2 * n + q, pos); BIT cnt(q); int p = (int)ev.size() - 1; long long res = 0; for(int i = n - 1;i >= 0;--i){ while(p >= 1 && max(v[i][0], v[i][1]) <= ev[p][0]){ cnt.Update(ev[p][1], 1); p--; } int indx = tree.Query(1, 1, 2 * n + q, min(v[i][0], v[i][1]), max(v[i][0], v[i][1]) - 1); int f = cnt.Sum(q) - cnt.Sum(indx); if(indx && v[i][0] < v[i][1])f++; f %= 2; res += compress[v[i][f]]; } cout << res << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...