제출 #1352072

#제출 시각아이디문제언어결과실행 시간메모리
1352072gayMarathon Race 2 (JOI24_ho_t3)C++20
62 / 100
1596 ms445264 KiB
#include <bits/stdc++.h>
#include <experimental/random>
#include <random>

//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;

using namespace std;

using ld = long double;
using ll = long long;

const ll INF = 1e18, MOD = 1e9 + 7;

void solve();

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int q = 1;
    //cin >> q;
    while (q--) {
        solve();
    }
}

void solve() {
    ll n, l;
    cin >> n >> l;
    vector<ll> cnt(l + 1);
    vector<ll> cord;
    ll mn = INF, mx = -INF;
    for (int i = 0; i < n; i++) {
        ll x; cin >> x;
        cnt[x]++;
        cord.push_back(x);
        mn = min(mn, x), mx = max(mx, x);
    }
    vector<ll> pref = {0};
    for (auto c : cnt) {
        pref.push_back(pref.back() + c);
    }

    sort(cord.begin(), cord.end());
    cord.resize(unique(cord.begin(), cord.end()) - cord.begin());
    ll m = (int)cord.size();

    vector<vector<vector<ll>>> dp1(m, vector<vector<ll>>(m, vector<ll>(2, INF)));
    vector<vector<vector<ll>>> dp2(m, vector<vector<ll>>(m, vector<ll>(2, INF)));
    dp1[0][m - 1][0] = 0;
    dp2[0][m - 1][1] = 0;
    for (ll len = m - 1; len > 0; len--) {
        for (ll i = 0; i + len < m; i++) {
            ll j = i + len;
            ll col = n - pref[cord[j] + 1] + pref[cord[i]] + 1;


            dp1[i + 1][j][0] = dp1[i][j][0] + (col + cnt[cord[i]]) * (cord[i + 1] - cord[i]);
            dp1[i][j - 1][1] = dp1[i][j][0] + (cord[j] - cord[i]) * col + (col + cnt[cord[j]]) * (cord[j] - cord[j - 1]);
            dp1[i + 1][j][0] = min(dp1[i + 1][j][0], dp1[i][j][1] + (cord[j] - cord[i]) * col + (col + cnt[cord[i]]) * (cord[i + 1] - cord[i]));
            dp1[i][j - 1][1] = min(dp1[i][j - 1][1], dp1[i][j][1] + (col + cnt[cord[j]]) * (cord[j] - cord[j - 1]));

            dp2[i + 1][j][0] = dp2[i][j][0] + (col + cnt[cord[i]]) * (cord[i + 1] - cord[i]);
            dp2[i][j - 1][1] = dp2[i][j][0] + (cord[j] - cord[i]) * col + (col + cnt[cord[j]]) * (cord[j] - cord[j - 1]);
            dp2[i + 1][j][0] = min(dp2[i + 1][j][0], dp2[i][j][1] + (cord[j] - cord[i]) * col + (col + cnt[cord[i]]) * (cord[i + 1] - cord[i]));
            dp2[i][j - 1][1] = min(dp2[i][j - 1][1], dp2[i][j][1] + (col + cnt[cord[j]]) * (cord[j] - cord[j - 1]));
        }
    }

    ll q; cin >> q;
    while (q--) {
        ll s, g, t;
        cin >> s >> g >> t;
        t -= n;
        ll ans = INF;
        for (int x = 0; x < m; x++) {
            ans = min(ans, abs(s - mn) + min(dp1[x][x][0], dp1[x][x][1]) + abs(cord[x] - g) * (n + 1));
            ans = min(ans, abs(s - mx) + min(dp2[x][x][0], dp2[x][x][1]) + abs(cord[x] - g) * (n + 1));
        }
        if (ans <= t) {
            cout << "Yes\n";
        } else {
            cout << "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...