Submission #922117

#TimeUsernameProblemLanguageResultExecution timeMemory
922117406Fortune Telling 2 (JOI14_fortune_telling2)C++17
100 / 100
309 ms69312 KiB
#include "bits/stdc++.h" #define int long long using namespace std; const long long INF = 1ll << 60; const int N = 6e5 + 5; const int L = 20; int suf[N]; int a[N], b[N], n, k, t[N], MN[N], MX[N], T[L][N]; array<int, 2> srt_t[N]; vector<int> d; vector<array<int, 2>> V[N], non; bitset<N> bit; bool kol = 0; void add(int r) { kol ^= 1; r++; for (; r < N; r += r & -r) bit[r] = bit[r] ^ 1; } bool get(int r) { r++; bool re = 0; for (; r; r -= r & -r) re ^= bit[r]; return re; } bool get_suf(int r) { return kol ^ get(r - 1); } int rmq(int l, int r) { int t = __lg(r - l); return max(T[t][l], T[t][r - (1 << t)]); } signed main() { ios::sync_with_stdio(0), cin.tie(0); cin >> n >> k; for (int i = 0; i < n; i++) { cin >> a[i] >> b[i]; d.push_back(a[i]); d.push_back(b[i]); MN[i] = min(a[i], b[i]); MX[i] = max(a[i], b[i]); } for (int i = 0; i < k; i++) { cin >> t[i]; d.push_back(t[i]); } sort(d.begin(), d.end()); d.resize(unique(d.begin(), d.end()) - d.begin()); for (int i = 0; i < n; i++) a[i] = lower_bound(d.begin(), d.end(), a[i]) - d.begin(), b[i] = lower_bound(d.begin(), d.end(), b[i]) - d.begin(); for (int i = 0; i < k; i++) t[i] = lower_bound(d.begin(), d.end(), t[i]) - d.begin(); for (int i = 0; i < k; i++) srt_t[i] = {t[i], i}; sort(srt_t, srt_t + k); for (int i = 0; i < k; i++) T[0][i] = srt_t[i][1]; for (int l = 0; l < L - 1; l++) for (int i = 0; i + (2 << l) <= k; i++) T[l + 1][i] = max(T[l][i], T[l][i + (1 << l)]); for (int i = 0; i < n; i++) { int mn = min(a[i], b[i]), l, mx = max(a[i], b[i]); int ind1 = lower_bound(srt_t, srt_t + k, array<int, 2>{mn, -1}) - srt_t; int ind2 = upper_bound(srt_t, srt_t + k, array<int, 2>{mx, -1}) - srt_t; if (ind1 >= ind2) l = -1; else l = rmq(ind1, ind2); //cout << "LATEST " << l + 1 << '\n'; int q; if (l == -1) { q = (a[i] <= b[i]); non.push_back({q, i}); } else { q = 0; V[l].push_back({q, i}); } } int S = 0; for (int i = k - 1; i >= 0; i--) { for (auto p: V[i]) { int q = p[0]; int mx = max(a[p[1]], b[p[1]]); q ^= get_suf(mx); S += (q ? MN[p[1]] : MX[p[1]]); } add(t[i]); } for (auto p: non) { int q = p[0]; int mx = max(a[p[1]], b[p[1]]); q ^= get_suf(mx); S += (q ? MN[p[1]] : MX[p[1]]); //cout << (q ? MN[p[1]] : MX[p[1]]) << ' '; } cout << S << '\n'; return 0; } //به زآن که فروشند چه خواهند خرید
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...