제출 #411254

#제출 시각아이디문제언어결과실행 시간메모리
411254AlperenTFortune Telling 2 (JOI14_fortune_telling2)C++17
100 / 100
469 ms45560 KiB
#include <bits/stdc++.h> using namespace std; const long long N = 3e5 + 5; long long n, k, t[N], ans, tindx[N * 2], indx, cnt; priority_queue<pair<long long, long long>> pq; struct Card{ long long a, b, aa, bb; bool swapped; bool operator < (Card &scnd) const{ return a > scnd.a; } }; Card cards[N]; struct SegTree{ long long tree[(N * 2) * 4]; void build(long long v, long long l, long long r){ if(l == r) tree[v] = tindx[l]; else{ long long m = l + (r - l) / 2; build(v * 2, l, m); build(v * 2 + 1, m + 1, r); tree[v] = max(tree[v * 2], tree[v * 2 + 1]); } } long long query(long long v, long long tl, long long tr, long long l, long long r){ if(l > r) return 0; else if(tl == l && tr == r) return tree[v]; else{ long long tm = tl + (tr - tl) / 2; return max(query(v * 2, tl, tm, l, min(tm, r)), query(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r)); } } }; SegTree segtree; struct Fenwick{ long long tree[N * 2]; long long getsum(long long r){ long long sum = 0; for(long long i = r; i >= 1; i -= i & (-i)){ sum += tree[i]; } return sum; } long long query(long long l, long long r){ return getsum(r) - getsum(l - 1); } void update(long long pos, long long val){ for(long long i = pos; i < N * 2; i += i & (-i)){ tree[i] += val; } } }; Fenwick fw; void compress(){ vector<long long> nums; for(long long i = 1; i <= n; i++) nums.push_back(cards[i].a), nums.push_back(cards[i].b); for(long long i = 1; i <= k; i++) nums.push_back(t[i]); sort(nums.begin(), nums.end()); nums.erase(unique(nums.begin(), nums.end()), nums.end()); for(long long i = 1; i <= n; i++){ cards[i].aa = cards[i].a; cards[i].a = lower_bound(nums.begin(), nums.end(), cards[i].a) - nums.begin() + 1; cards[i].bb = cards[i].b; cards[i].b = lower_bound(nums.begin(), nums.end(), cards[i].b) - nums.begin() + 1; } for(long long i = 1; i <= k; i++) t[i] = lower_bound(nums.begin(), nums.end(), t[i]) - nums.begin() + 1; } int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL); cin >> n >> k; for(long long i = 1; i <= n; i++){ cin >> cards[i].a >> cards[i].b; if(cards[i].b > cards[i].a) swap(cards[i].a, cards[i].b), cards[i].swapped = true; } for(long long i = 1; i <= k; i++) cin >> t[i]; compress(); sort(cards + 1, cards + n + 1); for(long long i = 1; i <= k; i++){ pq.push({t[i], i}); tindx[t[i]] = max(tindx[t[i]], i); } segtree.build(1, 1, N * 2); for(long long i = 1; i <= n; i++){ while(!pq.empty() && pq.top().first >= cards[i].a){ fw.update(pq.top().second, 1); pq.pop(); } indx = segtree.query(1, 1, N * 2, cards[i].b, cards[i].a - 1); cnt = fw.query(indx + 1, N * 2); if(indx == 0){ if(cards[i].swapped) ans += (cnt % 2 == 0 ? cards[i].bb : cards[i].aa); else ans += (cnt % 2 == 0 ? cards[i].aa : cards[i].bb); } else{ ans += (cnt % 2 == 0 ? cards[i].aa : cards[i].bb); } } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...