제출 #1310988

#제출 시각아이디문제언어결과실행 시간메모리
1310988MarceantasyMarathon Race 2 (JOI24_ho_t3)C++20
100 / 100
148 ms31640 KiB
#include <bits/stdc++.h>
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#define cr(v, n) (v).clear(), (v).resize(n);
using namespace std;
using lint = long long;
using pi = array<lint, 2>;
const int MAXN = 1005;

lint dp[MAXN][MAXN][2], sum[MAXN];
lint compL[MAXN][MAXN], compR[MAXN][MAXN];
lint opts[MAXN][2];

// slkdfj

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	vector<pi> a;
	int m;
	{
		int n, z;
		cin >> n >> z;
		vector<int> b(n);
		for (auto &x : b) {
			cin >> x;
		}
		sort(all(b));
		for (int i = 0; i < n;) {
			int j = i;
			while (j < n && b[i] == b[j])
				j++;
			a.push_back({b[i], j - i});
			i = j;
		}
		m = n;
	}
	int n = sz(a);
	int q;
	cin >> q;
	if (n > 1000) { // :thumbsdown:
		while (q--)
			cout << "No\n";
		return 0;
	}
	for (int i = 0; i < n; i++)
		sum[i + 1] = sum[i] + a[i][1];
	memset(opts, 0x3f, sizeof(opts));
	for (int i = 0; i < 2; i++) {
		memset(dp, 0x3f, sizeof(dp));
		dp[0][n - 1][i] = 0;
		for (int i = n - 1; i >= 0; i--) {
			for (int j = 0; j + i < n; j++) {
				int s = j, e = j + i;
				lint tot = m + 1 - (sum[e + 1] - sum[s]);
				if (s > 0) {
					lint costs = (a[e][0] - a[s - 1][0]) * tot;
					dp[s][e][1] = costs + compL[s - 1][e];
				}
				if (e + 1 < n) {
					lint costs = (a[e + 1][0] - a[s][0]) * tot;
					dp[s][e][0] = costs + compR[s][e + 1];
				}
				compL[s][e] = dp[s][e][0];
				compR[s][e] = dp[s][e][1];
				if (s > 0)
					compL[s][e] = min(compL[s][e], compL[s - 1][e] + (tot) * (a[s][0] - a[s - 1][0]));
				if (e + 1 < n) {
					compR[s][e] = min(compR[s][e], compR[s][e + 1] + tot * (a[e + 1][0] - a[e][0]));
				}
			}
		}
		for (int j = 0; j < n; j++) {
			opts[j][i] = min(dp[j][j][0], dp[j][j][1]);
		}
	}
	while (q--) {
		int s, e, x;
		cin >> s >> e >> x;
		lint ans = 1e18;
		int q = lower_bound(all(a), pi{e, -1}) - a.begin();
		for (int i = max(q - 3, 0); i < min(q + 3, n); i++) {
			ans = min(ans, 1ll * abs(a[i][0] - e) * (m + 1) + m + opts[i][0] + abs(s - a[0][0]));
			ans = min(ans, 1ll * abs(a[i][0] - e) * (m + 1) + m + opts[i][1] + abs(s - a[n - 1][0]));
		}
		//	cout << ans << endl;
		cout << (ans <= x ? "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...