Submission #289613

#TimeUsernameProblemLanguageResultExecution timeMemory
289613ngotienhungFortune Telling 2 (JOI14_fortune_telling2)C++14
35 / 100
158 ms11940 KiB
#include <bits/stdc++.h> #define pb push_back #define ll long long #define ff first #define ss second using namespace std; const int maxN = 2e5 + 5; const int inf = 1e9; int a[maxN], b[maxN], t[maxN], st[maxN * 4], fen[maxN], n, k, sz; vector<int> q[maxN]; void update(int v, int l, int r, int idx, int x) { if(l > idx || r < idx) return; if(l == idx && r == idx){ st[v] = x; return; } int mid = (l + r) / 2; update(v * 2, l, mid, idx, x); update(v * 2 + 1, mid + 1, r, idx, x); st[v] = max(st[v * 2], st[v * 2 + 1]); } int query(int v, int l, int r, int ql, int qr) { if(l > qr || r < ql) return 0; if(l >= ql && r <= qr) return st[v]; int mid = (l + r) / 2; return max(query(v * 2, l, mid, ql, qr), query(v * 2 + 1, mid + 1, r, ql, qr)); } void add(int i){ if(!i) return; while(i <= sz){ fen[i]++; i += (i & (-i)); } } int sum(int i){ int res = 0; while(i > 0){ res += fen[i]; i -= (i & (-i)); } return res; } int rangesum(int l, int r){ return sum(r) - sum(l - 1); } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> k; vector<int> v; for(int i = 1; i <= n; i++){ cin >> a[i] >> b[i]; v.pb(a[i]); v.pb(b[i]); } for(int i = 1; i <= k; i++){ cin >> t[i]; v.pb(t[i]); } sort(v.begin(), v.end()); v.resize(distance(v.begin(), unique(v.begin(), v.end()))); sz = v.size(); for(int i = 1; i <= k; i++){ t[i] = lower_bound(v.begin(), v.end(), t[i]) - v.begin() + 1; update(1, 1, v.size(), t[i], i); } ll res = 0; for(int i = 1; i <= n; i++){ if(a[i] == b[i]){ res += a[i]; continue; } a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1; b[i] = lower_bound(v.begin(), v.end(), b[i]) - v.begin() + 1; int mx = query(1, 1, v.size(), min(a[i], b[i]), max(a[i], b[i]) - 1); if(mx && a[i] < b[i]) swap(a[i], b[i]); q[mx].pb(i); } for(int i = k; i >= 0; --i){ for(auto x : q[i]){ int cnt = sum(sz) - sum(max(a[x], b[x]) - 1); if(cnt & 1) swap(a[x], b[x]); res += v[a[x] - 1]; } add(t[i]); } cout << res << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...