This documentation is automatically generated by competitive-verifier/competitive-verifier
// competitive-verifier: PROBLEM https://onlinejudge.u-aizu.ac.jp/problems/2725
// competitive-verifier: TLE 2
// competitive-verifier: MLE 64
#include <iostream>
#include <numeric>
#include "src/Optimization/ConvexHullTrick.hpp"
using namespace std;
signed main() {
cin.tie(0);
ios::sync_with_stdio(false);
int N, T;
cin >> N >> T;
int t[N], p[N], f[N];
for (int i= 0; i < N; ++i) cin >> t[i] >> p[i] >> f[i];
int ord[N];
iota(ord, ord + N, 0), sort(ord, ord + N, [&](int i, int j) { return f[i] < f[j]; });
ConvexHullTrick<long long, MAXIMIZE> cht[T + 1];
long long ans= -1e9;
for (int i= 0; i < N; ++i) {
int I= ord[i], ti= t[I];
for (int x= T; x >= ti; --x) {
long long val= p[I];
if (!cht[x - ti].empty()) val= max(val, cht[x - ti].query(f[I]) + p[I] - f[I] * f[I]);
ans= max(ans, val);
cht[x].insert(2 * f[I], val - f[I] * f[I]);
}
}
cout << ans << '\n';
return 0;
}
#line 1 "test/aoj/2725.CHT.test.cpp"
// competitive-verifier: PROBLEM https://onlinejudge.u-aizu.ac.jp/problems/2725
// competitive-verifier: TLE 2
// competitive-verifier: MLE 64
#include <iostream>
#include <numeric>
#line 2 "src/Optimization/ConvexHullTrick.hpp"
#include <limits>
#include <algorithm>
#include <set>
#include <array>
#include <cassert>
#line 2 "src/Optimization/MinMaxEnum.hpp"
enum MinMaxEnum { MAXIMIZE= -1, MINIMIZE= 1 };
#line 8 "src/Optimization/ConvexHullTrick.hpp"
template <typename T, MinMaxEnum obj= MINIMIZE> class ConvexHullTrick {
struct Line {
T k, m;
mutable T p;
bool operator<(const Line &o) const { return k < o.k; }
bool operator<(T x) const { return p < x; }
};
static constexpr T INF= std::numeric_limits<T>::max();
static T lc_div(T a, T b) {
if constexpr (std::is_integral_v<T>) return a / b - ((a ^ b) < 0 && a % b);
else return a / b;
}
using ms= std::multiset<Line, std::less<>>;
ms ls;
bool insect(typename ms::iterator x, typename ms::iterator y) {
if (y == ls.end()) return x->p= INF, false;
if (x->k == y->k) x->p= (x->m > y->m ? INF : -INF);
else x->p= lc_div(y->m - x->m, x->k - y->k);
return x->p >= y->p;
}
public:
void insert(T k, T m) {
if constexpr (obj == MINIMIZE) k= -k, m= -m;
auto z= ls.insert({k, m, 0}), y= z++, x= y;
while (insect(y, z)) z= ls.erase(z);
if (x != ls.begin() && insect(--x, y)) insect(x, y= ls.erase(y));
while ((y= x) != ls.begin() && (--x)->p >= y->p) insect(x, ls.erase(y));
}
bool empty() const { return ls.empty(); }
std::array<T, 2> query_line(T x) const {
assert(!ls.empty());
auto l= ls.lower_bound(x);
if constexpr (obj == MINIMIZE) return {-l->k, -l->m};
else return {l->k, l->m};
}
T query(T x) const {
auto [k, m]= query_line(x);
return k * x + m;
}
};
template <typename T> class ConvexHullTrick_XY {
ConvexHullTrick<long double, MINIMIZE> cht_mn;
ConvexHullTrick<long double, MAXIMIZE> cht_mx;
T amx= std::numeric_limits<T>::lowest(), amn= std::numeric_limits<T>::max();
public:
void insert(T a, T b) { cht_mn.insert(a, b), cht_mx.insert(a, b), amn= std::min(amn, a), amx= std::max(amx, a); }
bool empty() const { return cht_mn.empty(); }
T get_max(T x, T y) const {
assert(!cht_mn.empty());
if (y == 0) return std::max(amn * x, amx * x);
auto z= (long double)x / y;
auto [a, b]= y > 0 ? cht_mx.query_line(z) : cht_mn.query_line(z);
return T(a) * x + T(b) * y;
}
T get_min(T x, T y) const {
assert(!cht_mn.empty());
if (y == 0) return std::min(amn * x, amx * x);
auto z= (long double)x / y;
auto [a, b]= y > 0 ? cht_mn.query_line(z) : cht_mx.query_line(z);
return T(a) * x + T(b) * y;
}
};
#line 7 "test/aoj/2725.CHT.test.cpp"
using namespace std;
signed main() {
cin.tie(0);
ios::sync_with_stdio(false);
int N, T;
cin >> N >> T;
int t[N], p[N], f[N];
for (int i= 0; i < N; ++i) cin >> t[i] >> p[i] >> f[i];
int ord[N];
iota(ord, ord + N, 0), sort(ord, ord + N, [&](int i, int j) { return f[i] < f[j]; });
ConvexHullTrick<long long, MAXIMIZE> cht[T + 1];
long long ans= -1e9;
for (int i= 0; i < N; ++i) {
int I= ord[i], ti= t[I];
for (int x= T; x >= ti; --x) {
long long val= p[I];
if (!cht[x - ti].empty()) val= max(val, cht[x - ti].query(f[I]) + p[I] - f[I] * f[I]);
ans= max(ans, val);
cht[x].insert(2 * f[I], val - f[I] * f[I]);
}
}
cout << ans << '\n';
return 0;
}
Env | Name | Status | Elapsed | Memory |
---|---|---|---|---|
g++-13 | 00_sample_00 |
![]() |
9 ms | 4 MB |
g++-13 | 00_sample_01 |
![]() |
9 ms | 4 MB |
g++-13 | 00_sample_02 |
![]() |
9 ms | 4 MB |
g++-13 | 00_sample_03 |
![]() |
9 ms | 3 MB |
g++-13 | 00_sample_04 |
![]() |
8 ms | 3 MB |
g++-13 | 01_rando_medium_031 |
![]() |
10 ms | 4 MB |
g++-13 | 01_rando_medium_035 |
![]() |
9 ms | 4 MB |
g++-13 | 01_rando_medium_160 |
![]() |
9 ms | 4 MB |
g++-13 | 01_rando_medium_278 |
![]() |
9 ms | 4 MB |
g++-13 | 01_rando_medium_337 |
![]() |
10 ms | 3 MB |
g++-13 | 01_rando_medium_342 |
![]() |
10 ms | 3 MB |
g++-13 | 01_rando_medium_355 |
![]() |
9 ms | 4 MB |
g++-13 | 01_rando_medium_452 |
![]() |
9 ms | 4 MB |
g++-13 | 01_rando_medium_467 |
![]() |
9 ms | 4 MB |
g++-13 | 01_rando_medium_665 |
![]() |
9 ms | 3 MB |
g++-13 | 02_rando_large_000 |
![]() |
15 ms | 4 MB |
g++-13 | 02_rando_large_013 |
![]() |
10 ms | 4 MB |
g++-13 | 02_rando_large_048 |
![]() |
12 ms | 4 MB |
g++-13 | 02_rando_large_054 |
![]() |
22 ms | 4 MB |
g++-13 | 02_rando_large_083 |
![]() |
14 ms | 4 MB |
g++-13 | 02_rando_large_147 |
![]() |
12 ms | 4 MB |
g++-13 | 02_rando_large_164 |
![]() |
21 ms | 4 MB |
g++-13 | 02_rando_large_227 |
![]() |
19 ms | 4 MB |
g++-13 | 02_rando_large_283 |
![]() |
25 ms | 4 MB |
g++-13 | 02_rando_large_336 |
![]() |
18 ms | 4 MB |
g++-13 | 02_rando_large_368 |
![]() |
16 ms | 4 MB |
g++-13 | 05_attack_00 |
![]() |
9 ms | 4 MB |
g++-13 | 05_attack_01 |
![]() |
9 ms | 4 MB |
g++-13 | 05_attack_mi0803_00 |
![]() |
9 ms | 4 MB |
g++-13 | 10_random_small_000 |
![]() |
9 ms | 3 MB |
g++-13 | 10_random_small_001 |
![]() |
9 ms | 4 MB |
g++-13 | 10_random_small_002 |
![]() |
9 ms | 4 MB |
g++-13 | 10_random_small_003 |
![]() |
9 ms | 4 MB |
g++-13 | 10_random_small_004 |
![]() |
9 ms | 4 MB |
g++-13 | 10_random_small_005 |
![]() |
9 ms | 4 MB |
g++-13 | 10_random_small_006 |
![]() |
9 ms | 4 MB |
g++-13 | 10_random_small_007 |
![]() |
9 ms | 4 MB |
g++-13 | 10_random_small_008 |
![]() |
9 ms | 4 MB |
g++-13 | 10_random_small_009 |
![]() |
9 ms | 4 MB |
g++-13 | 11_rando_medium_000 |
![]() |
9 ms | 4 MB |
g++-13 | 11_rando_medium_001 |
![]() |
9 ms | 4 MB |
g++-13 | 11_rando_medium_002 |
![]() |
9 ms | 4 MB |
g++-13 | 11_rando_medium_003 |
![]() |
9 ms | 4 MB |
g++-13 | 11_rando_medium_004 |
![]() |
9 ms | 4 MB |
g++-13 | 11_rando_medium_005 |
![]() |
9 ms | 4 MB |
g++-13 | 11_rando_medium_006 |
![]() |
9 ms | 4 MB |
g++-13 | 11_rando_medium_007 |
![]() |
9 ms | 4 MB |
g++-13 | 11_rando_medium_008 |
![]() |
10 ms | 4 MB |
g++-13 | 11_rando_medium_009 |
![]() |
9 ms | 4 MB |
g++-13 | 12_random_large_000 |
![]() |
309 ms | 6 MB |
g++-13 | 12_random_large_001 |
![]() |
287 ms | 7 MB |
g++-13 | 12_random_large_002 |
![]() |
869 ms | 8 MB |
g++-13 | 12_random_large_003 |
![]() |
55 ms | 6 MB |
g++-13 | 12_random_large_004 |
![]() |
556 ms | 7 MB |
g++-13 | 12_random_large_005 |
![]() |
115 ms | 6 MB |
g++-13 | 12_random_large_006 |
![]() |
621 ms | 7 MB |
g++-13 | 12_random_large_007 |
![]() |
34 ms | 5 MB |
g++-13 | 12_random_large_008 |
![]() |
239 ms | 7 MB |
g++-13 | 12_random_large_009 |
![]() |
248 ms | 6 MB |
g++-13 | 22_shortMusics_Large_000 |
![]() |
938 ms | 9 MB |
g++-13 | 22_shortMusics_Large_001 |
![]() |
832 ms | 8 MB |
g++-13 | 22_shortMusics_Large_002 |
![]() |
1694 ms | 10 MB |
g++-13 | 22_shortMusics_Large_003 |
![]() |
1709 ms | 10 MB |
g++-13 | 22_shortMusics_Large_004 |
![]() |
1281 ms | 9 MB |
g++-13 | 22_shortMusics_Large_005 |
![]() |
1698 ms | 10 MB |
g++-13 | 22_shortMusics_Large_006 |
![]() |
1079 ms | 10 MB |
g++-13 | 22_shortMusics_Large_007 |
![]() |
1404 ms | 11 MB |
g++-13 | 22_shortMusics_Large_008 |
![]() |
672 ms | 8 MB |
g++-13 | 22_shortMusics_Large_009 |
![]() |
924 ms | 9 MB |
g++-13 | 41_separate_medium_000 |
![]() |
9 ms | 4 MB |
g++-13 | 41_separate_medium_001 |
![]() |
9 ms | 4 MB |
g++-13 | 41_separate_medium_002 |
![]() |
9 ms | 4 MB |
g++-13 | 41_separate_medium_003 |
![]() |
8 ms | 4 MB |
g++-13 | 41_separate_medium_004 |
![]() |
8 ms | 4 MB |
g++-13 | 42_separate_large_000 |
![]() |
177 ms | 5 MB |
g++-13 | 42_separate_large_001 |
![]() |
256 ms | 6 MB |
g++-13 | 42_separate_large_002 |
![]() |
186 ms | 5 MB |
g++-13 | 42_separate_large_003 |
![]() |
331 ms | 5 MB |
g++-13 | 42_separate_large_004 |
![]() |
236 ms | 5 MB |
clang++-18 | 00_sample_00 |
![]() |
9 ms | 4 MB |
clang++-18 | 00_sample_01 |
![]() |
9 ms | 4 MB |
clang++-18 | 00_sample_02 |
![]() |
9 ms | 4 MB |
clang++-18 | 00_sample_03 |
![]() |
9 ms | 4 MB |
clang++-18 | 00_sample_04 |
![]() |
10 ms | 4 MB |
clang++-18 | 01_rando_medium_031 |
![]() |
9 ms | 4 MB |
clang++-18 | 01_rando_medium_035 |
![]() |
9 ms | 4 MB |
clang++-18 | 01_rando_medium_160 |
![]() |
9 ms | 4 MB |
clang++-18 | 01_rando_medium_278 |
![]() |
9 ms | 4 MB |
clang++-18 | 01_rando_medium_337 |
![]() |
9 ms | 4 MB |
clang++-18 | 01_rando_medium_342 |
![]() |
9 ms | 4 MB |
clang++-18 | 01_rando_medium_355 |
![]() |
9 ms | 4 MB |
clang++-18 | 01_rando_medium_452 |
![]() |
9 ms | 4 MB |
clang++-18 | 01_rando_medium_467 |
![]() |
9 ms | 4 MB |
clang++-18 | 01_rando_medium_665 |
![]() |
9 ms | 4 MB |
clang++-18 | 02_rando_large_000 |
![]() |
15 ms | 4 MB |
clang++-18 | 02_rando_large_013 |
![]() |
10 ms | 4 MB |
clang++-18 | 02_rando_large_048 |
![]() |
12 ms | 4 MB |
clang++-18 | 02_rando_large_054 |
![]() |
22 ms | 4 MB |
clang++-18 | 02_rando_large_083 |
![]() |
15 ms | 4 MB |
clang++-18 | 02_rando_large_147 |
![]() |
10 ms | 4 MB |
clang++-18 | 02_rando_large_164 |
![]() |
22 ms | 4 MB |
clang++-18 | 02_rando_large_227 |
![]() |
19 ms | 4 MB |
clang++-18 | 02_rando_large_283 |
![]() |
25 ms | 4 MB |
clang++-18 | 02_rando_large_336 |
![]() |
18 ms | 4 MB |
clang++-18 | 02_rando_large_368 |
![]() |
16 ms | 4 MB |
clang++-18 | 05_attack_00 |
![]() |
9 ms | 4 MB |
clang++-18 | 05_attack_01 |
![]() |
9 ms | 4 MB |
clang++-18 | 05_attack_mi0803_00 |
![]() |
9 ms | 4 MB |
clang++-18 | 10_random_small_000 |
![]() |
9 ms | 4 MB |
clang++-18 | 10_random_small_001 |
![]() |
9 ms | 4 MB |
clang++-18 | 10_random_small_002 |
![]() |
9 ms | 4 MB |
clang++-18 | 10_random_small_003 |
![]() |
9 ms | 4 MB |
clang++-18 | 10_random_small_004 |
![]() |
8 ms | 4 MB |
clang++-18 | 10_random_small_005 |
![]() |
10 ms | 4 MB |
clang++-18 | 10_random_small_006 |
![]() |
9 ms | 4 MB |
clang++-18 | 10_random_small_007 |
![]() |
9 ms | 4 MB |
clang++-18 | 10_random_small_008 |
![]() |
9 ms | 4 MB |
clang++-18 | 10_random_small_009 |
![]() |
9 ms | 4 MB |
clang++-18 | 11_rando_medium_000 |
![]() |
10 ms | 4 MB |
clang++-18 | 11_rando_medium_001 |
![]() |
9 ms | 4 MB |
clang++-18 | 11_rando_medium_002 |
![]() |
10 ms | 4 MB |
clang++-18 | 11_rando_medium_003 |
![]() |
10 ms | 4 MB |
clang++-18 | 11_rando_medium_004 |
![]() |
9 ms | 4 MB |
clang++-18 | 11_rando_medium_005 |
![]() |
9 ms | 4 MB |
clang++-18 | 11_rando_medium_006 |
![]() |
10 ms | 4 MB |
clang++-18 | 11_rando_medium_007 |
![]() |
9 ms | 4 MB |
clang++-18 | 11_rando_medium_008 |
![]() |
9 ms | 4 MB |
clang++-18 | 11_rando_medium_009 |
![]() |
9 ms | 4 MB |
clang++-18 | 12_random_large_000 |
![]() |
335 ms | 6 MB |
clang++-18 | 12_random_large_001 |
![]() |
311 ms | 7 MB |
clang++-18 | 12_random_large_002 |
![]() |
903 ms | 8 MB |
clang++-18 | 12_random_large_003 |
![]() |
57 ms | 6 MB |
clang++-18 | 12_random_large_004 |
![]() |
598 ms | 7 MB |
clang++-18 | 12_random_large_005 |
![]() |
124 ms | 6 MB |
clang++-18 | 12_random_large_006 |
![]() |
676 ms | 7 MB |
clang++-18 | 12_random_large_007 |
![]() |
36 ms | 5 MB |
clang++-18 | 12_random_large_008 |
![]() |
253 ms | 7 MB |
clang++-18 | 12_random_large_009 |
![]() |
272 ms | 6 MB |
clang++-18 | 22_shortMusics_Large_000 |
![]() |
1068 ms | 9 MB |
clang++-18 | 22_shortMusics_Large_001 |
![]() |
970 ms | 8 MB |
clang++-18 | 22_shortMusics_Large_002 |
![]() |
1902 ms | 10 MB |
clang++-18 | 22_shortMusics_Large_003 |
![]() |
2009 ms | 0 MB |
clang++-18 | 22_shortMusics_Large_004 |
![]() |
1418 ms | 8 MB |
clang++-18 | 22_shortMusics_Large_005 |
![]() |
1865 ms | 10 MB |
clang++-18 | 22_shortMusics_Large_006 |
![]() |
1216 ms | 10 MB |
clang++-18 | 22_shortMusics_Large_007 |
![]() |
1659 ms | 11 MB |
clang++-18 | 22_shortMusics_Large_008 |
![]() |
785 ms | 8 MB |
clang++-18 | 22_shortMusics_Large_009 |
![]() |
1057 ms | 9 MB |
clang++-18 | 41_separate_medium_000 |
![]() |
10 ms | 4 MB |
clang++-18 | 41_separate_medium_001 |
![]() |
10 ms | 4 MB |
clang++-18 | 41_separate_medium_002 |
![]() |
9 ms | 4 MB |
clang++-18 | 41_separate_medium_003 |
![]() |
9 ms | 4 MB |
clang++-18 | 41_separate_medium_004 |
![]() |
9 ms | 4 MB |
clang++-18 | 42_separate_large_000 |
![]() |
181 ms | 5 MB |
clang++-18 | 42_separate_large_001 |
![]() |
261 ms | 6 MB |
clang++-18 | 42_separate_large_002 |
![]() |
190 ms | 5 MB |
clang++-18 | 42_separate_large_003 |
![]() |
333 ms | 5 MB |
clang++-18 | 42_separate_large_004 |
![]() |
243 ms | 5 MB |