求调,52pts
查看原帖
求调,52pts
167697
BartAllen楼主2024/10/6 21:53
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e3 + 5;
const int L = 5e5 + 5;

int n, m, q, cnt[L], a[N];
int dp[N][N][2][2];

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		cnt[a[i]]++;
	}
	for (int i = 1; i <= m; i++) cnt[i] += cnt[i - 1];
	sort(a + 1, a + n + 1);
	n = unique(a + 1, a + n + 1) - a - 1;
	cin >> q;
	if (n >= 1000) {
		while (q--) cout << "No" << endl;
		return 0;
	}
	memset(dp, 0x3f, sizeof(dp));
	dp[1][n][0][0] = dp[1][n][1][1] = 0;
	for (int len = n - 1; len; len--)
		for (int l = 1, r = len; r <= n; l++, r++) {
			int s = cnt[a[l] - 1] + cnt[m] - cnt[a[r]] + 1;
			for (int x = 0; x <= 1; x++) {
				dp[l][r][x][0] = min(dp[l - 1][r][x][0] + s * (a[l] - a[l - 1]), dp[l][r + 1][x][1] + s * (a[r + 1] - a[l]));
				dp[l][r][x][1] = min(dp[l - 1][r][x][0] + s * (a[r] - a[l - 1]), dp[l][r + 1][x][1] + s * (a[r + 1] - a[r]));
			}
		}
	while (q--) {
		int s, t, k;
		cin >> s >> t >> k;
		int ans = 1e18;
		if (t <= a[n]) {
			int i = lower_bound(a + 1, a + n + 1, t) - a;
			ans = min(ans, dp[i][i][0][0] + abs(s - a[1]) + 1ll * (cnt[m] + 1) * abs(a[i] - t)); 
			ans = min(ans, dp[i][i][1][0] + abs(s - a[n]) + 1ll * (cnt[m] + 1) * abs(a[i] - t));
		}
		if (a[1] <= t) {
			int i = upper_bound(a + 1, a + n + 1, t) - a - 1;
			ans = min(ans, dp[i][i][0][0] + abs(s - a[1]) + 1ll * (cnt[m] + 1) * abs(a[i] - t));
			ans = min(ans, dp[i][i][1][0] + abs(s - a[n]) + 1ll * (cnt[m] + 1) * abs(a[i] - t));
		}
		if (ans + cnt[m] <= k) cout << "Yes" << endl;
		else cout << "No" << endl;
	}
	return 0;
}
2024/10/6 21:53
加载中...