結果
問題 | No.448 ゆきこーだーの雨と雪 (3) |
ユーザー |
|
提出日時 | 2016-11-19 00:18:04 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 223 ms / 2,000 ms |
コード長 | 3,145 bytes |
コンパイル時間 | 1,169 ms |
コンパイル使用メモリ | 102,908 KB |
実行使用メモリ | 9,504 KB |
最終ジャッジ日時 | 2024-06-11 19:32:52 |
合計ジャッジ時間 | 5,512 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 35 |
ソースコード
#include <iostream>#include <vector>#include <algorithm>#include <numeric>#include <array>#include <set>#include <map>#include <queue>#include <tuple>#include <unordered_set>#include <unordered_map>#include <functional>#include <cmath>#include <cassert>#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))#define repeat_from(i,m,n) for (int i = (m); (i) < (n); ++(i))#define repeat_reverse(i,n) for (int i = (n)-1; (i) >= 0; --(i))#define repeat_from_reverse(i,m,n) for (int i = (n)-1; (i) >= (m); --(i))#define whole(f,x,...) ([&](decltype((x)) whole) { return (f)(begin(whole), end(whole), ## __VA_ARGS__); })(x)typedef long long ll;using namespace std;template <class T> void setmax(T & a, T const & b) { if (a < b) a = b; }template <class T> void setmin(T & a, T const & b) { if (b < a) a = b; }template <typename T>struct segment_tree { // on monoidint n;vector<T> a;function<T (T,T)> append; // associativeT unit; // unitsegment_tree() = default;template <typename F>segment_tree(int a_n, T a_unit, F a_append) {n = pow(2,ceil(log2(a_n)));a.resize(2*n-1, a_unit);unit = a_unit;append = a_append;}void point_update(int i, T z) {a[i+n-1] = z;for (i = (i+n)/2; i > 0; i /= 2) {a[i-1] = append(a[2*i-1], a[2*i]);}}T range_concat(int l, int r) {return range_concat(0, 0, n, l, r);}T range_concat(int i, int il, int ir, int l, int r) {if (l <= il and ir <= r) {return a[i];} else if (ir <= l or r <= il) {return unit;} else {return append(range_concat(2*i+1, il, (il+ir)/2, l, r),range_concat(2*i+2, (il+ir)/2, ir, l, r));}}};const ll inf = ll(1e18)+9;int main() {// inputint n, k; cin >> n >> k;vector<ll> t(n+1), d(n); {t[0] = - k;repeat (i,n) cin >> t[i+1] >> d[i];}// computell sum_d = whole(accumulate, d, 0ll);auto func = [&](ll limit) {vector<ll> dp(n+1, - inf); // dpdp[0] = 0;int last = 0;repeat (i,n) {int j = (whole(upper_bound, t, t[i+1]-k) - 1) - t.begin();assert (t[i+1] - t[j] >= k);if (d[i] <= limit) {dp[i+1] = dp[i];if (last <= j) setmax(dp[i+1], dp[j] + d[i]);} else {if (j < last) return inf;dp[i+1] = dp[j] + d[i];last = i+1;}assert (dp[i+1] <= inf);}return sum_d - dp[n];};vector<ll> sorted_d = d;sorted_d.push_back(-1);sorted_d.push_back(0);sorted_d.push_back(inf);whole(sort, sorted_d);sorted_d.erase(whole(unique, sorted_d), sorted_d.end());int l = 0, r = n+1; // [l, r), binary searchwhile (l+1 < r) {int m = (l + r) / 2;(func(sorted_d[m]) < inf ? r : l) = m;}// outputll limit = sorted_d[r];cout << limit << endl;cout << func(limit) << endl;return 0;}