QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#94047 | #6122. Impossible-to-finish Race | sinbad# | TL | 2ms | 3496kb | C++ | 4.7kb | 2023-04-05 08:41:38 | 2023-04-05 08:41:39 |
Judging History
answer
// #define LOCAL
#define _USE_MATH_DEFINES
#include <array>
#include <cassert>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <algorithm>
#include <complex>
#include <cmath>
#include <numeric>
#include <bitset>
#include <functional>
#include <random>
#include <ctime>
using namespace std;
template <typename A, typename B>
ostream& operator <<(ostream& out, const pair<A, B>& a) {
out << "(" << a.first << "," << a.second << ")";
return out;
}
template <typename T, size_t N>
ostream& operator <<(ostream& out, const array<T, N>& a) {
out << "["; bool first = true;
for (auto& v : a) { out << (first ? "" : ", "); out << v; first = 0;} out << "]";
return out;
}
template <typename T>
ostream& operator <<(ostream& out, const vector<T>& a) {
out << "["; bool first = true;
for (auto v : a) { out << (first ? "" : ", "); out << v; first = 0;} out << "]";
return out;
}
template <typename T, class Cmp>
ostream& operator <<(ostream& out, const set<T, Cmp>& a) {
out << "{"; bool first = true;
for (auto& v : a) { out << (first ? "" : ", "); out << v; first = 0;} out << "}";
return out;
}
template <typename T, class Cmp>
ostream& operator <<(ostream& out, const multiset<T, Cmp>& a) {
out << "{"; bool first = true;
for (auto& v : a) { out << (first ? "" : ", "); out << v; first = 0;} out << "}";
return out;
}
template <typename U, typename T, class Cmp>
ostream& operator <<(ostream& out, const map<U, T, Cmp>& a) {
out << "{"; bool first = true;
for (auto& p : a) { out << (first ? "" : ", "); out << p.first << ":" << p.second; first = 0;} out << "}";
return out;
}
#ifdef LOCAL
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
#else
#define trace(...) 42
#endif
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
cerr << name << ": " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
const char* comma = strchr(names + 1, ',');
cerr.write(names, comma - names) << ": " << arg1 << " |";
__f(comma + 1, args...);
}
template <class T> auto vect(const T& v, int n) { return vector<T>(n, v); }
template <class T, class... D> auto vect(const T& v, int n, D... m) {
return vector<decltype(vect(v, m...))>(n, vect(v, m...));
}
using int64 = long long;
using int128 = __int128_t;
using ii = pair<int, int>;
#define SZ(x) (int)((x).size())
template <typename T> static constexpr T inf = numeric_limits<T>::max() / 2;
const int MOD = 1e9 + 7;
// const int MOD = 998244353;
mt19937_64 mrand(random_device{}());
int64 rnd(int64 x) { return mrand() % x; }
constexpr inline int lg2(int64 x) { return x == 0 ? -1 : sizeof(int64) * 8 - 1 - __builtin_clzll(x); }
constexpr inline int p2ceil(int64 x) { return 1 << (lg2(x - 1) + 1); }
template <class T> void out(const vector<T>& a) { for (int i = 0; i < SZ(a); ++i) cout << a[i] << " \n"[i + 1 == SZ(a)]; }
template <class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; }
template <class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; }
template <class T> void dedup(vector<T>& v) { sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); }
inline void add_mod(int& x, int y) { x += y; if (x >= MOD) x -= MOD; }
inline void sub_mod(int& x, int y) { x += MOD - y; if (x >= MOD) x -= MOD; }
inline int mod(int x) { return x >= MOD ? x - MOD : x; }
struct fast_ios {
fast_ios() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cout << fixed << setprecision(10);
};
} fast_ios_;
int main() {
int n, m;
cin >> n >> m;
vector<array<int, 2>> a(n); // H, A
for (int i = 0; i < n; ++i) cin >> a[i][1] >> a[i][0];
sort(a.begin(), a.end());
trace(a);
vector<int> best(n);
best[n - 1] = a[n - 1][1] - a[n - 1][0];
for (int i = n - 2; i >= 0; --i) best[i] = max(best[i + 1], a[i][1] - a[i][0]);
trace(best);
auto dp = vect<int64>(-1, n, m);
function<int64(int, int)> solve =
[&](int pos, int cnt) -> int64 {
if (pos == n) return -inf<int64>;
if (cnt == m - 1) return best[pos];
int64& ret = dp[pos][cnt];
if (ret >= 0) return ret;
ret = -inf<int64>;
// pick
ckmax(ret, solve(pos + 1, cnt + 1) + a[pos][1] + (cnt == 0 ? a[pos][0] : 0));
// no pick
ckmax(ret, solve(pos + 1, cnt));
trace(pos, cnt, ret);
return ret;
};
int64 ret = solve(0, 0);
cout << ret << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3496kb
input:
4 2 40 150 100 185 60 160 80 170
output:
165
result:
ok 1 number(s): "165"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3408kb
input:
4 3 40 150 100 185 60 160 80 170
output:
215
result:
ok 1 number(s): "215"
Test #3:
score: 0
Accepted
time: 2ms
memory: 3468kb
input:
4 3 40 150 100 300 60 160 80 140
output:
160
result:
ok 1 number(s): "160"
Test #4:
score: 0
Accepted
time: 2ms
memory: 3400kb
input:
10 5 31 41 59 26 53 58 97 93 23 84 62 64 33 83 27 95 2 84 19 71
output:
237
result:
ok 1 number(s): "237"
Test #5:
score: -100
Time Limit Exceeded
input:
41152 111 182257016 930588061 48161946 238486760 972227016 5356065 86027096 260499041 669036106 225099150 237412554 751531756 242943966 295403431 389306712 171941587 805402434 808802744 223087510 185548988 484802407 630362813 909265069 146703978 669049492 795632652 880214973 687316602 917988759 1140...