Submission #1174412

#TimeUsernameProblemLanguageResultExecution timeMemory
1174412TsaganaMarathon Race 2 (JOI24_ho_t3)C++20
100 / 100
448 ms21612 KiB
#include<bits/stdc++.h>

#define IOS ios_base::sync_with_stdio(false);cin.tie();cout.tie();
#define all(a) a.begin(), a.end()
#define int long long
#define pq priority_queue
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define pp pop_back
#define F first
#define S second

using namespace std;

const int Inf = 2e18;
int n, L, joi;
int a[500010];
int p[500010];
int dp[2][1010][1010];
int f[2][1010];
vector<pair<int,int>> v;

void prep() {
	sort(a + 1, a + n + 1);
	v.pb({a[1] , 0});
	for (int i = 1; i <= n; i++) {
		if (v.back().F == a[i]) v.back().S++;
		else v.pb({a[i], 1});
		p[a[i]]++;
	}
	n = v.size();
	for (int i = 1; i < 500000; i++) p[i] += p[i-1];
}

void build() {
	if (n >= 1010) return;
	for (int T = 0; T < 2; T++) {
		for (int l = 0; l < n; l++)
			for (int r = 0; r < n; r++)
				dp[0][l][r] = dp[1][l][r] = Inf;

		dp[T][0][n-1] = 0;
		for (int len = n; len > 1; len--)
			for (int l = 0 , r = len-1; r < n; l++, r++) {
				int cnt = joi + p[v[l].F-1 ] - p[v[r].F] + 1;

				dp[0][l+1][r] = min(dp[0][l+1][r] , dp[0][l][r] + (cnt + v[l].S)*(v[l+1].F-v[l].F));
				dp[0][l+1][r] = min(dp[0][l+1][r] , dp[1][l][r] + cnt*(v[r].F+v[l+1].F-2*v[l].F)+v[l].S*(v[l+1].F-v[l].F));

				dp[1][l][r-1] = min(dp[1][l][r-1] , dp[1][l][r] + (cnt + v[r].S)*(v[r].F-v[r-1].F));
				dp[1][l][r-1] = min(dp[1][l][r-1] , dp[0][l][r] + cnt*(2*v[r].F-v[l].F-v[r-1].F) + v[r].S*(v[r].F-v[r-1].F));
			}

		for (int i = 0; i < n; i++) f[T][i] = min(dp[0][i][i] , dp[1][i][i]);
	}
}

void solve () {
	cin >> n >> L; joi = n;
	for (int i = 1; i <= n; i++) cin >> a[i];

	prep();
	build();

	int q; cin >> q;
	while (q--) {
		int st , en , T;
		cin >> st >> en >> T;
		T -= joi;
		if (n >= 1010)  {cout << "No\n"; continue ;}
		int k = lb(all(v), make_pair(en, 0ll)) - v.begin();
		int ans = Inf;
		for (int i = max(0ll, k-2); i <= min(n-1, k+2); i++) {
			ans = min(ans, f[0][i] + abs(st-v[0].F) + (joi+1)*abs(en-v[i].F));
			ans = min(ans, f[1][i] + abs(st-v[n-1].F) + (joi+1)*abs(en-v[i].F));
		}
		if (ans <= T) cout << "Yes\n";
		else cout << "No\n";
	}
}
signed main() {IOS solve(); return 0;}
#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...