Submission #972051

#TimeUsernameProblemLanguageResultExecution timeMemory
972051happypotatoOvertaking (IOI23_overtaking)C++17
0 / 100
1 ms348 KiB
#include "overtaking.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ff first
#define ss second
#define pb push_back
ll L;
ll speed;
vector<int> s;
map<ll, ll> ans; // (l, r]
void DebugMap() {
	cerr << "DEBUG MAP:" << endl;
	for (pll cur : ans) {
		cerr << cur.ff << ' ' << cur.ss << endl;
	}
	cerr << "END" << endl << endl;
}
void AddRange(int l, int r) {
	// cerr << "ADDING " << l << ' ' << r << endl;
	map<ll, ll>::iterator it;
	ll mxr = r;
	while (true) {
		it = ans.lower_bound(r);
		if (it == ans.begin()) break;
		--it;
		if (it->ff <= l && r <= it->ss) return;
		if (it->ss <= r) break;
		mxr = max(mxr, it->ss);
		ans.erase(it);
	}
	ans[l] = mxr;
	// DebugMap();
}
void init(int L_, int n, vector<long long> T, vector<int> W, int X, int m, vector<int> s) {
	L = L_; speed = X;
	vector<pll> blocks;
	for (int i = 0; i < n; i++) {
		if (W[i] <= speed) continue;
		blocks.pb({T[i], W[i]});
	}
	sort(blocks.begin(), blocks.end());
	n = blocks.size();
	ll times[m][n];
	for (int i = 0; i < n; i++) times[0][i] = blocks[i].ff;
	for (int i = 1; i < m; i++) {
		vector<pair<pll, int>> range;
		ll dt = s[i] - s[i - 1];
		for (int j = 0; j < n; j++) {
			range.pb({{times[i - 1][j], times[i - 1][j] + blocks[j].ss * dt}, j});
		}
		sort(range.begin(), range.end());
		ll mx = 0;
		for (int j = 0; j < n; j++) {
			mx = max(mx, range[j].ff.ss);
			times[i][range[j].ss] = mx;
		}
	}

	// for (int i = 0; i < m; i++) {
	// 	for (int j = 0; j < n; j++) {
	// 		cerr << times[i][j] << ' ';
	// 	}
	// 	cerr << endl;
	// }
	// cerr << endl;

	for (int i = m - 1; i >= 1; i--) {
		vector<pll> range;
		for (int j = 0; j < n; j++) {
			ll st = times[i - 1][j] - speed * s[i - 1];
			ll en = times[i][j] - speed * s[i];
			range.pb({st, en});
		}
		sort(range.begin(), range.end());
		for (pll cur : range) {
			AddRange(cur.ff, cur.ss);
		}
	}
}

long long arrival_time(long long x) {
	ll res = x + L * speed;
	map<ll, ll>::iterator it = ans.lower_bound(x);
	if (it != ans.begin()) {
		--it;
		res = max(res, it->ss + L * speed);
	}
	return res;
}
#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...