Submission #1149416

#TimeUsernameProblemLanguageResultExecution timeMemory
1149416steveonalex코알라 (JOI13_koala)C++20
100 / 100
99 ms9032 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define MASK(i) (1ULL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) #define ALL(v) (v).begin(), (v).end() ll max(ll a, ll b){return (a > b) ? a : b;} ll min(ll a, ll b){return (a < b) ? a : b;} ll gcd(ll a, ll b){return __gcd(a, b);} ll lcm(ll a, ll b){return a / gcd(a, b) * b;} ll LASTBIT(ll mask){return (mask) & (-mask);} int pop_cnt(ull mask){return __builtin_popcountll(mask);} int ctz(ull mask){return __builtin_ctzll(mask);} int logOf(ull mask){return 63 - __builtin_clzll(mask);} // mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); mt19937_64 rng(1); ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);} template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b) {a = b; return true;} return false; } template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b) {a = b; return true;} return false; } template <class T> void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){ for(auto item: container) out << item << separator; out << finish; } template <class T> void remove_dup(vector<T> &a){ sort(ALL(a)); a.resize(unique(ALL(a)) - a.begin()); } const ll INF = 1e18 + 69; struct SegmentTree{ struct Node{ ll val, lazy; Node(ll val, ll lazy): val(val), lazy(lazy){} }; int n; vector<Node> a; SegmentTree(int _n){ n = _n; a.resize(n * 4 + 4, Node(0, 0)); } void apply_node(int id, ll val){ a[id].val += val; a[id].lazy += val; } void down(int id){ apply_node(id * 2, a[id].lazy); apply_node(id * 2 + 1, a[id].lazy); a[id].lazy = 0; } void update(int u, int v, ll w, int l, int r, int id){ if (u <= l && r <= v) { apply_node(id, w); return; } if (a[id].lazy) down(id); int mid = (l + r) >> 1; if (u <= mid) update(u, v, w, l, mid, id * 2); if (v > mid) update(u, v, w, mid + 1, r, id * 2 + 1); a[id].val = min(a[id * 2].val, a[id * 2 + 1].val); } void update(int u, int v, ll w){ maximize(u, 0); minimize(v, n-1); if (u <= v) update(u, v, w, 0, n-1, 1); } void assign(int i, ll w, int l, int r, int id){ if (l == r) { minimize(a[id].val, w); return; } if (a[id].lazy) down(id); int mid = (l + r) >> 1; if (i <= mid) assign(i, w, l, mid, id * 2); if (i > mid) assign(i, w, mid + 1, r, id * 2 + 1); a[id].val = min(a[id * 2].val, a[id * 2 + 1].val); } void assign(int i, ll w){ assign(i, w, 0, n-1, 1); } ll get(int u,int v, int l, int r, int id){ if (u <= l && r <= v) return a[id].val; if (a[id].lazy) down(id); int mid = (l + r) >> 1; ll ans = INF; if (u <= mid) minimize(ans, get(u, v, l, mid, id * 2)); if (v > mid) minimize(ans, get(u, v, mid + 1, r, id * 2 + 1)); return ans; } ll get(int l, int r){ if (l > r) return INF; return get(l, r, 0, n-1, 1); } }; void solve(){ int K, M, D, A, n; cin >> K >> M >> D >> A >> n; vector<ll> a(n+2), c(n+2); a[0] = K; for(int i = 1; i <= n; ++i) cin >> a[i] >> c[i]; a[n+1] = M; for(auto &i: a) i -= K; M -= K; K -= K; vector<ll> b = a; for(ll &i: b) i = i % D; remove_dup(b); int m = b.size(); SegmentTree st(m); st.update(0, m-1, INF); st.assign(0, 0); for(int i = 1; i<=n+1; ++i){ int idx = lower_bound(ALL(b), a[i] % D) - b.begin(); ll dist = a[i] - a[i-1]; ll cnt = dist / D; st.update(0, m-1, cnt * A); if (dist % D != 0){ ll amount = dist % D; ll l = a[i] % D - amount + 1; ll r = a[i] % D; for(int t = 0; t <= 1; ++t){ int idx1 = lower_bound(ALL(b), l) - b.begin(), idx2 = upper_bound(ALL(b), r) - b.begin() - 1; st.update(idx1, idx2, A); l += D; r += D; } } ll cur = INF; minimize(cur, st.get(0, m-1)); minimize(cur, st.get(idx, idx) - A); cur = cur + A - c[i]; st.assign(idx, cur); if (i == n+1) cout << -st.get(idx, idx) << "\n"; // cout << st.get(0, m-1) << "\n"; } // cout << st.get(0, m-1) << "\n"; } int main(void){ ios::sync_with_stdio(0);cin.tie(0); cout.tie(0); clock_t start = clock(); solve(); cerr << "Time elapsed: " << clock() - start << " ms\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...