QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#94047#6122. Impossible-to-finish Racesinbad#TL 2ms3496kbC++4.7kb2023-04-05 08:41:382023-04-05 08:41:39

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-04-05 08:41:39]
  • 评测
  • 测评结果:TL
  • 用时:2ms
  • 内存:3496kb
  • [2023-04-05 08:41:38]
  • 提交

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;
}

详细

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...

output:


result: