제출 #274174

#제출 시각아이디문제언어결과실행 시간메모리
274174Falcon운세 보기 2 (JOI14_fortune_telling2)C++14
100 / 100
447 ms30040 KiB
#pragma GCC optimize("O2") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #ifdef DEBUG #include "debug.hpp" #endif using namespace std; using namespace __gnu_pbds; #define all(c) (c).begin(), (c).end() #define traverse(c, it) for(auto it = (c).begin(); it != (c).end(); it++) #define rep(i, N) for(int i = 0; i < (N); i++) #define rep1(i, N) for(int i = 1; i <= (N); i++) #define rep2(i, s, e) for(int i = (s); i <= (e); i++) #define rep3(i, s, e, d) for(int i = (s); (d) >= 0 ? i <= (e) : i >= (e); i += (d)) #define pb push_back #ifdef XDEBUG #define debug(x...) {dbg::depth++; string dbg_vals = dbg::to_string(x); dbg::depth--; dbg::fprint(__func__, __LINE__, #x, dbg_vals);} #define light_debug(x) {dbg::light = 1; dbg::dout << __func__ << ":" << __LINE__ << " " << #x << " = " << x << endl; dbg::light = 0;} #else #define debug(x...) #define light_debug(x) #endif template<typename T> T& ckmin(T& a, T b){ return a = a > b ? b : a; } template<typename T> T& ckmax(T& a, T b){ return a = a < b ? b : a; } using ll = long long; using pii = pair<int, int>; using vi = vector<int>; using ordered_multiset = tree<pii, null_type, less<pii>, rb_tree_tag, tree_order_statistics_node_update>; class Compress{ vi vals; public: inline int rank(int x) const{ return lower_bound(all(vals), x) - vals.begin(); } Compress(vi& v){ vals = v; sort(all(vals)); vals.erase(unique(all(vals)), vals.end()); for(auto& x : v) x = rank(x); } inline int size() const{ return vals.size(); } }; class segtree{ int n; vi seg; inline void pull(int i){ seg[i] = max(seg[i << 1], seg[i << 1 | 1]); } public: inline segtree(int _n){ n = _n; seg.resize(n << 1); fill(all(seg), -1); } void update(int i, int v){ for(ckmax(seg[i += n], v), i >>= 1; i; i >>= 1) pull(i); } // [s, e) int query(int s, int e) const{ int m = -1; for(s += n, e += n; s < e; s >>= 1, e >>= 1){ if(s & 1) ckmax(m, seg[s++]); if(e & 1) ckmax(m, seg[--e]); } return m; } }; signed main(){ ios_base::sync_with_stdio(false); cin.tie(0), cout.tie(0); #ifdef DEBUG freopen("debug", "w", stderr); #endif int N, K; cin >> N >> K; vi A(N), B(N), T(K); rep(i, N) cin >> A[i] >> B[i]; rep(i, K) cin >> T[i]; Compress compress(T); segtree seg(compress.size()); debug(T); rep(i, K) seg.update(T[i], i); struct query{ int r, i; }; vector<vector<query>> qs(K + 1); rep(i, N){ int l = compress.rank(A[i]); int r = compress.rank(B[i]); if(l > r) swap(l, r); int t = seg.query(l, r); if(t != -1 && A[i] < B[i]) swap(A[i], B[i]); debug(i, t, l, r) qs[t + 1].pb({r, i}); } ordered_multiset S; rep3(i, K - 1, 0, -1){ S.insert({T[i], i}); for(auto& q : qs[i]){ if((K - i - S.order_of_key({q.r, -1})) & 1) swap(A[q.i], B[q.i]); } } cout << accumulate(all(A), 0LL) << '\n'; #ifdef DEBUG dbg::dout << "\nExecution time: " << clock() << "ms\n"; #endif return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...