Submission #1267485

#TimeUsernameProblemLanguageResultExecution timeMemory
1267485g4yuhgFortune Telling 2 (JOI14_fortune_telling2)C++20
100 / 100
377 ms29516 KiB
//Huyduocdithitp #include <bits/stdc++.h> typedef long long ll; #define pii pair<ll, ll> #define MP make_pair #define fi first #define se second #define TASK "connect" #define faster ios_base::sync_with_stdio(false);cin.tie(NULL); #define N 1000005 #define LOG 18 #define endl '\n' using namespace std; ll n, m, s, kq[N]; pii a[N]; pii t[N]; vector<ll> ns; bool cmp(pii a, pii b) { return max(a.fi, a.se) > max(b.fi, b.se); } ll st[4 * N], bit[N]; void upd(ll u, ll v) { ll idx = u; while (idx <= s) { bit[idx] += v; idx += idx & (-idx); } } ll get(ll u) { ll idx = u, ans = 0; while (idx > 0) { ans += bit[idx]; idx -= idx & (-idx); } return ans; } void update(ll id, ll l, ll r, ll i, ll v) { if (i > r || i < l) return; if (l == r) { if (v == 0) st[id] = 0; else st[id] = max(st[id], v); return; } ll mid = (l + r) / 2; update(id * 2, l, mid, i, v); update(id * 2 + 1, mid + 1, r, i, v); st[id] = max(st[id * 2], st[id * 2 + 1]); } ll get(ll id, ll l, ll r, ll L, ll R) { if (l > R || r < L) return 0; if (L <= l && r <= R) return st[id]; ll mid = (l + r) / 2; return max(get(id * 2, l, mid, L, R), get(id * 2 + 1, mid + 1, r, L, R)); } void pre() { s = ns.size(); sort(ns.begin(), ns.end()); ns.resize(unique(ns.begin(), ns.end()) - ns.begin()); for (int i = 1; i <= n; i ++) { a[i].fi = lower_bound(ns.begin(), ns.end(), a[i].fi) - ns.begin() + 1; a[i].se = lower_bound(ns.begin(), ns.end(), a[i].se) - ns.begin() + 1; } for (int i = 1; i <= m; i ++) { t[i].fi = lower_bound(ns.begin(), ns.end(), t[i].fi) - ns.begin() + 1; update(1, 1, s, t[i].fi, i); //cout << " len " << t[i].fi << " " << i << endl; t[i].se = i; } sort(t + 1, t + 1 + m); } void solve() { ll ans = 0; ll cur = m; for (int i = 1; i <= n; i ++) { //cout << a[i].fi << " " << a[i].se << endl; } for (int i = 1; i <= m; i ++) { //cout << t[i].fi << " "; } //cout << endl; for (int i = 1; i <= n; i ++) { bool flag = 0; if (a[i].fi > a[i].se) { flag = 1; swap(a[i].fi, a[i].se); } while (cur >= 1 && t[cur].fi >= max(a[i].fi, a[i].se)) { update(1, 1, s, t[cur].fi, 0); //cout << " t cur ve 0 " << t[cur].fi << " " << st[1] << endl; upd(t[cur].se, 1); //cout << "upd cur " << t[cur].se << endl; cur -- ; } if (a[i].fi == a[i].se) { ans += ns[a[i].fi - 1]; continue; } ll id = get(1, 1, s, a[i].fi, a[i].se - 1); ll dem = get(s) - get(id); //cout << i << " id " << id << " flag " << flag << " d " << dem << " a " << ans << endl; if (id == 0 && flag == 1) { dem ++ ; if (dem % 2 == 1) { ans += ns[a[i].se - 1]; } else { ans += ns[a[i].fi - 1]; } continue; } if (a[i].fi < a[i].se && id > 0) swap(a[i].fi, a[i].se); //cout << "_ " << a[i].fi << " " << a[i].se << endl; if (dem % 2 == 0) { ans += ns[a[i].fi - 1]; } else { ans += ns[a[i].se - 1]; } } cout << ans; } signed main(void) { faster; cin >> n >> m; for (int i = 1; i <= n; i ++) { cin >> a[i].fi >> a[i].se; ns.push_back(a[i].fi); ns.push_back(a[i].se); } sort(a + 1, a + 1 + n, cmp); for (int i = 1; i <= m; i ++) { cin >> t[i].fi; ns.push_back(t[i].fi); } pre(); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...