Submission #1240212

#TimeUsernameProblemLanguageResultExecution timeMemory
1240212rythm_of_knightMarathon Race 2 (JOI24_ho_t3)C++17
100 / 100
741 ms41096 KiB
#include <bits/stdc++.h> #define all(x) x.begin(), x.end() #define ar array using namespace std; typedef long long ll; const ll N = 5e5 + 5, K = 1415; ll a[N], dp[K][K][2], ds[K][K][2], pr[K], sf[K]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll n, l; cin >> n >> l; vector <ll> x(1), prf(1); for (ll i = 1; i <= n; i++) { ll b; cin >> b; a[b]++; } ll tmp = 0; for (ll i = 0; i < N; i++) if (a[i]) tmp += a[i], x.push_back(i), prf.push_back(tmp); ll cnt = n + 1, cur = 1; n = x.size(); n--; if (n < K) { for (ll i = 1; i <= n; i++) for (ll j = 1; j <= n; j++) for (ll k = 0; k < 2; k++) dp[i][j][k] = ds[i][j][k] = N; dp[1][n][0] = ds[1][n][1] = 0; dp[1][n][1] = ds[1][n][0] = x[n] - x[1]; for (ll add = n - 2; add >= 0; add--) { for (ll l = 1; l + add <= n; l++) { ll r = l + add, res = 0; if (l > 1) { dp[l][r][0] = dp[l - 1][r][0]; cur = cnt - prf[r] + prf[l - 2]; res += a[x[l - 1]]; cur += a[x[l - 1]]; res += (x[l] - x[l - 1]) * cur; res = min(res, N); dp[l][r][0] += res; } res = 0; if (r < n) { dp[l][r][1] = dp[l][r + 1][1]; cur = cnt - prf[r + 1] + prf[l - 1]; res += a[x[r + 1]]; cur += a[x[r + 1]]; res += (x[r + 1] - x[r]) * cur; res = min(res, N); dp[l][r][1] += res; } dp[l][r][0] = min(dp[l][r][0], dp[l][r][1] + (x[r] - x[l]) * (cnt - prf[r] + prf[l - 1])); dp[l][r][1] = min(dp[l][r][1], dp[l][r][0] + (x[r] - x[l]) * (cnt - prf[r] + prf[l - 1])); } } for (ll add = n - 2; add >= 0; add--) { for (ll l = 1; l + add <= n; l++) { ll r = l + add, res = 0; if (l > 1) { ds[l][r][0] = ds[l - 1][r][0]; cur = cnt - prf[r] + prf[l - 2]; res += a[x[l - 1]]; cur += a[x[l - 1]]; res += (x[l] - x[l - 1]) * cur; res = min(res, N); ds[l][r][0] += res; } res = 0; if (r < n) { ds[l][r][1] = ds[l][r + 1][1]; cur = cnt - prf[r + 1] + prf[l - 1]; res += a[x[r + 1]]; cur += a[x[r + 1]]; res += (x[r + 1] - x[r]) * cur; res = min(res, N); ds[l][r][1] += res; } ds[l][r][0] = min(ds[l][r][0], ds[l][r][1] + (x[r] - x[l]) * (cnt - prf[r] + prf[l - 1])); ds[l][r][1] = min(ds[l][r][1], ds[l][r][0] + (x[r] - x[l]) * (cnt - prf[r] + prf[l - 1])); } } for (ll i = 1; i <= n; i++) pr[i] = min(dp[i][i][0], dp[i][i][1]) + a[x[i]]; for (ll i = 1; i <= n; i++) sf[i] = min(ds[i][i][0], ds[i][i][1]) + a[x[i]]; // for (ll i = 1; i <= n; i++) // cout << pr[i] << ' '; // cout << '\n'; // for (ll i = 1; i <= n; i++) // cout << sf[i] << ' '; // cout << '\n'; } ll q; cin >> q; while (q--) { ll s, g, t; cin >> s >> g >> t; if (n >= K) { cout << "No\n"; continue; } ll ans = N; for (ll i = 1; i <= n; i++) ans = min(ans, min(llabs(s - x[1]) + pr[i], llabs(s - x[n]) + sf[i]) + 1ll * cnt * llabs(g - x[i])); // cout << ans << ' '; 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...