216062026-01-13 17:07:24algoproBenzinkút üzemeltetés (55)cpp17Accepted 55/552ms508 KiB
// UUID: a1bc7014-a1eb-4dd5-8470-93c5bc79bdba
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;

int main() {
	int n, k; cin >> n >> k;

	vector<int> t(n+1), h(n+1);

	for (int i = 1; i <= n; i++) {
		cin >> t[i] >> h[i];
	}

	vector<int> elozo(n+1); //melyik a leghnamraabb amit választhatok

	for (int i = 1; i <= n; i++) {
		int lo = 1;
		int hi = i-1; 
		int ans = 0;

		while (lo <= hi) {
			int kozep = (lo+hi) / 2;
			if (t[i] - t[kozep] >= k) {
				ans = kozep;
				lo = kozep+1;
			} else {
				hi = kozep-1;
			}
		}
		elozo[i] = ans;
  




	}



	vector<int> dp(n+1, 0); //dp[i] = max haszon az első i cuccból
	vector<bool> valasztasok(n+1, false);

	for (int i = 1; i <= n; i++) {
		int elveszem = h[i]+dp[elozo[i]];
		int kihagyom = dp[i-1];

		if (elveszem > kihagyom) {
			dp[i] = elveszem;
			valasztasok[i] = true; 
		} else {
			dp[i] = kihagyom;
		}
	}

	vector<int> megoldas;

	for (int i = n; i > 0;) {
		if (valasztasok[i]) {
			megoldas.push_back(i);
			i = elozo[i];
		}else {
			i--;
		}
	}

	reverse(megoldas.begin(), megoldas.end());



	

	cout << dp[n];

	cout << "\n";

	cout << megoldas.size() << " ";

	for (int i = 0; i < megoldas.size(); i++) {
		cout << megoldas[i] << " ";
	}

}
SubtaskSumTestVerdictTimeMemory
base55/55
1Accepted0/01ms500 KiB
2Accepted0/02ms316 KiB
3Accepted3/31ms316 KiB
4Accepted3/31ms508 KiB
5Accepted3/31ms316 KiB
6Accepted3/31ms316 KiB
7Accepted3/31ms316 KiB
8Accepted3/31ms316 KiB
9Accepted3/31ms332 KiB
10Accepted3/31ms316 KiB
11Accepted3/31ms508 KiB
12Accepted3/31ms316 KiB
13Accepted4/41ms316 KiB
14Accepted4/41ms316 KiB
15Accepted5/51ms316 KiB
16Accepted6/62ms336 KiB
17Accepted6/61ms316 KiB