Submission #1214535

#TimeUsernameProblemLanguageResultExecution timeMemory
1214535mdn2002Marathon Race 2 (JOI24_ho_t3)C++20
100 / 100
643 ms159136 KiB
/* Mayoeba Yabureru */ #pragma GCC optimize("O3,unroll-loops") #include <bits/stdc++.h> using namespace std; long long dp[2][2][5003][5003]; void solve() { long long n, l, all; cin >> n >> l; all = n; map<int, int> mp; for (int i = 0; i < n; i ++) { int x; cin >> x; mp[x] ++; } vector<vector<int>> v; for (auto [x, y] : mp) v.push_back({x, y}); if (v.size() > 5000) { int q; cin >> q; while (q --) { int x, y, z; cin >> x >> y >> z; cout << "No" << endl; } return; } sort(v.begin(), v.end()); n = v.size(); for (int i = 0; i < 2; i ++) { for (int j = 0; j <= n; j ++) { for (int z = 0; z <= n; z ++) dp[0][i][j][z] = dp[1][i][j][z] = 1e10; } } dp[0][0][0][n - 1] = dp[1][1][0][n - 1] = 0; for (int len = n; len > 1; len --) { int prefix = 0, suffix = 0, firstj = len - 1; for (int i = firstj; i < n; i ++) suffix += v[i][1]; for (int i = 0; i < n; i ++) { int j = i + len - 1; if (j >= n) break; suffix -= v[j][1]; int num = prefix + suffix; for (int z = 0; z <= 1; z ++) { dp[z][0][i + 1][j] = min(dp[z][0][i + 1][j], dp[z][0][i][j] + v[i][1] + abs(v[i][0] - v[i + 1][0]) * (num + v[i][1] + 1)); dp[z][1][i + 1][j] = min(dp[z][1][i + 1][j], dp[z][0][i][j] + v[i][1] + abs(v[i][0] - v[j][0]) * (num + v[i][1] + 1)); dp[z][1][i][j - 1] = min(dp[z][1][i][j - 1], dp[z][1][i][j] + v[j][1] + abs(v[j][0] - v[j - 1][0]) * (num + v[j][1] + 1)); dp[z][0][i][j - 1] = min(dp[z][0][i][j - 1], dp[z][1][i][j] + v[j][1] + abs(v[j][0] - v[i][0]) * (num + v[j][1] + 1)); } prefix += v[i][1]; } } set<vector<int>> vs; for (int i = 0; i < n; i ++) { vector vv = v[i]; vv.push_back(i); vs.insert(vv); } int q; cin >> q; while (q --) { int s, g, t; cin >> s >> g >> t; long long time = t + 1; auto it = vs.lower_bound({g, -1}); if (it != vs.end()) { auto vv = *it; int i = vv[2]; time = min(time, v[i][1] + min(dp[0][0][i][i], dp[0][1][i][i]) + abs(g - v[i][0]) * (all + 1) + abs(s - v[0][0])); time = min(time, v[i][1] + min(dp[1][0][i][i], dp[1][1][i][i]) + abs(g - v[i][0]) * (all + 1) + abs(s - v[n - 1][0])); } if (it != vs.begin()) { it --; auto vv = *it; int i = vv[2]; time = min(time, v[i][1] + min(dp[0][0][i][i], dp[0][1][i][i]) + abs(g - v[i][0]) * (all + 1) + abs(s - v[0][0])); time = min(time, v[i][1] + min(dp[1][0][i][i], dp[1][1][i][i]) + abs(g - v[i][0]) * (all + 1) + abs(s - v[n - 1][0])); } if (time <= t) cout << "Yes" << endl; else cout << "No" << endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int T = 1; for (int I = 1; I <= T; I++) { solve(); } }
#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...