Submission #1266635

#TimeUsernameProblemLanguageResultExecution timeMemory
1266635flashmtMarathon Race 2 (JOI24_ho_t3)C++20
100 / 100
132 ms25260 KiB
#include <bits/stdc++.h>
using namespace std;
const int oo = 1 << 20;

int main()
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int N, l;
  cin >> N >> l;
  vector<int> a(N);
  for (int &x : a)
    cin >> x;
  sort(begin(a), end(a));
  vector<pair<int, int>> b;
  for (int i = 0; i < N;)
  {
    int j = i + 1;
    while (j < N && a[j] == a[i])
      j++;
    b.push_back({a[i], j - i});
    i = j;
  }

  int n = size(b), q;
  cin >> q;
  if (n > 1000)
  {
    while (q--)
      cout << "No\n";
    return 0;
  }

  vector<int> pre(n);
  for (int i = 0; i < n; i++)
  {
    pre[i] = b[i].second;
    if (i)
      pre[i] += pre[i - 1];
  }

  auto getWeight = [&](int from, int to)
  {
    return N + 1 - pre[to] + (from ? pre[from - 1] : 0);
  };

  vector<vector<vector<long long>>> f(2, vector<vector<long long>>(n, vector<long long>(n, oo)));
  f[0][0][n - 1] = f[1][n - 1][0] = 0;
  for (int z : {0, 1})
    for (int len = n; len > 1; len--)
      for (int i = 0; i + len <= n; i++)
      {
        int j = i + len - 1;
        f[z][i + 1][j] = min(f[z][i + 1][j], f[z][i][j] + (b[i + 1].first - b[i].first) * getWeight(i + 1, j));
        f[z][j][i + 1] = min(f[z][j][i + 1], f[z][i][j] + (b[j].first - b[i].first) * getWeight(i + 1, j));
        f[z][i][j - 1] = min(f[z][i][j - 1], f[z][j][i] + (b[j].first - b[i].first) * getWeight(i, j - 1));
        f[z][j - 1][i] = min(f[z][j - 1][i], f[z][j][i] + (b[j].first - b[j - 1].first) * getWeight(i, j - 1));
      }

  while (q--)
  {
    int from, to, t;
    cin >> from >> to >> t;

    int id = lower_bound(begin(b), end(b), make_pair(to, 0)) - begin(b);
    long long ans = oo;
    for (int i = max(0, id - 1); i <= min(n - 1, id + 1); i++)
      for (int z : {0, 1})
      {
        long long cost = f[z][i][i] + (N + 1LL) * abs(to - b[i].first);
        cost += abs(from - (z ? b[n - 1].first : b[0].first));
        ans = min(ans, cost);
      }

    cout << (ans + N <= t ? "Yes" : "No") << '\n';
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...