Submission #361425

#TimeUsernameProblemLanguageResultExecution timeMemory
361425RyoPham운세 보기 2 (JOI14_fortune_telling2)C++14
100 / 100
635 ms41820 KiB
#define taskname "test" #include <bits/stdc++.h> using namespace std; #define sz(x) (int)x.size() #define fi first #define se second typedef long long lli; typedef pair<int, int> pii; const int maxn = 6e5 + 5; int n, k; pii cards[maxn]; int t[maxn]; vector<int> vals; vector<int> pos_val[maxn]; struct segment_tree { int max_pos[maxn * 4], total[maxn * 4]; void add_pos(int x, int l, int r, int p, int k) { if(l == r) { max_pos[x] = max(max_pos[x], k); return; } int mid = (l + r) / 2; if(p <= mid) add_pos(x * 2, l, mid, p, k); else add_pos(x * 2 + 1, mid + 1, r, p, k); max_pos[x] = max(max_pos[x * 2], max_pos[x * 2 + 1]); } int get_max_pos(int x, int l, int r, int L, int R) { if(L > r || l > R) return 0; if(l >= L && r <= R) return max_pos[x]; int mid = (l + r) / 2; return max(get_max_pos(x * 2, l, mid, L, R), get_max_pos(x * 2 + 1, mid + 1, r, L, R)); } void add(int x, int l, int r, int p) { if(l == r) { ++total[x]; return; } int mid = (l + r) / 2; if(p <= mid) add(x * 2, l, mid, p); else add(x * 2 + 1, mid + 1, r, p); total[x] = total[x * 2] + total[x * 2 + 1]; } int get_total(int x, int l, int r, int L, int R) { if(L > r || l > R || L > R) return 0; if(l >= L && r <= R) return total[x]; int mid = (l + r) / 2; return get_total(x * 2, l, mid, L, R) + get_total(x * 2 + 1, mid + 1, r, L, R); } } tree; void read_input() { cin >> n >> k; for(int i = 1; i <= n; ++i) cin >> cards[i].fi >> cards[i].se; for(int i = 1; i <= k; ++i) cin >> t[i]; } int lwb(const vector<int>&arr, int k) { return lower_bound(arr.begin(), arr.end(), k) - arr.begin() + 1; } void init() { for(int i = 1; i <= n; ++i) { vals.push_back(cards[i].fi); vals.push_back(cards[i].se); } for(int i = 1; i <= k; ++i) vals.push_back(t[i]); sort(vals.begin(), vals.end()); vals.erase(unique(vals.begin(), vals.end()), vals.end()); for(int i = 1; i <= n; ++i) { cards[i].fi = lwb(vals, cards[i].fi); cards[i].se = lwb(vals, cards[i].se); } for(int i = 1; i <= k; ++i) { t[i] = lwb(vals, t[i]); tree.add_pos(1, 1, sz(vals), t[i], i); pos_val[t[i]].push_back(i); } sort(cards + 1, cards + n + 1, [](pii p, pii q) { return max(p.fi, p.se) > max(q.fi, q.se); }); } void solve() { lli ans = 0; for(int i = 1, j = sz(vals); i <= n; ++i) { if(cards[i].fi == cards[i].se) { ans += vals[cards[i].fi - 1]; continue; } int mx = max(cards[i].fi, cards[i].se); int mn = min(cards[i].fi, cards[i].se); while(j >= mx) { for(auto&p: pos_val[j]) tree.add(1, 1, k, p); --j; } int p = tree.get_max_pos(1, 1, sz(vals), mn, mx - 1); int t = tree.get_total(1, 1, k, p + 1, k); if(p > 0) ans += (t & 1 ? vals[mn - 1] : vals[mx - 1]); else ans += (t & 1 ? vals[cards[i].se - 1] : vals[cards[i].fi - 1]); } cout << ans << '\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); read_input(); init(); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...