제출 #145316

#제출 시각아이디문제언어결과실행 시간메모리
145316gs18103코알라 (JOI13_koala)C++17
70 / 100
121 ms7916 KiB
#include <bits/stdc++.h> #define LINF 1000000000000000000LL using namespace std; typedef long long ll; ll t[101010]; ll tree[804040], b[101010], dp[101010]; vector <ll> num; ll update(int node, int s, int e, int k, ll val) { if(s == e) return tree[node] = max(tree[node], val); int m = (s+e)>>1; if(k <= m) tree[node] = max(tree[node*2+1], update(node*2, s, m, k, val)); else tree[node] = max(tree[node*2], update(node*2+1, m+1, e, k, val)); return tree[node]; } ll cal(int node, int s, int e, int l, int r) { if(s > r || e < l) return -LINF; if(s >= l && e <= r) return tree[node]; int m = (s+e)>>1; return max(cal(node*2, s, m, l, r), cal(node*2+1, m+1, e, l, r)); } int main() { ios::sync_with_stdio(false); cin.tie(0); ll K, M, D, n; ll A; cin >> K >> M >> D >> A >> n; M -= K; for(int i = 1; i <= n; i++) { cin >> t[i] >> b[i]; t[i] -= K; num.push_back(t[i] % D); } num.push_back(M % D); t[n+1] = M; sort(num.begin(), num.end()); for(int i = 0; i < 404040; i++) tree[i] = -LINF; update(1, 0, num.size()-1, 0, 0LL); for(int i = 1; i <= n+1; i++) { int k = lower_bound(num.begin(), num.end(), t[i] % D) - num.begin(); dp[i] = max(cal(1, 0, num.size()-1, 0, k-1) - A, cal(1, 0, num.size()-1, k, num.size()-1)) + b[i]; update(1, 0, num.size()-1, k, dp[i]); } cout << dp[n+1] - A * (M / D); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...