Submission #74566

#TimeUsernameProblemLanguageResultExecution timeMemory
74566shoemakerjoSemiexpress (JOI17_semiexpress)C++14
100 / 100
3 ms1000 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

#define maxn 3010
#define pii pair<ll, ll>
#define pil pair<ll, ll>
#define mp make_pair

ll ans = 0;
ll stops[maxn];
ll N;
int M, K;
ll A, B, C, T;
priority_queue< pair< pil, pii > > pq;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> N >> M >> K;
	cin >> A >> B >> C >> T;
	for (int i = 0; i < M; i++) {
		cin >> stops[i];
	}
	for (int i = 0; i < M-1; i++) {
		if (B*(stops[i]-1) <= T) ans++;
		else continue;
		ll numnx = (T - B*(stops[i]-1))/A;
		if (numnx >= stops[i+1]-stops[i]-1) {
			ans += stops[i+1]-stops[i]-1;

			// cout << "ans after " << stops[i] << ": " << ans << endl;
			continue;
		}
		ans += numnx;
		// cout << "ans after " << stops[i] << ": " << ans << endl;


		ll nxstop = stops[i] + numnx+1;
		if (nxstop == stops[i+1]) continue;
		ll ttaken = B*(stops[i] - 1) + C*(nxstop - stops[i]);
		if (ttaken > T) continue;
		ll nguys = (T-ttaken)/A;

		nguys = min(nguys, stops[i+1]-nxstop-1LL);
		ll ng = nguys+1; //because of first

		// cout << "      " <<  stops[i] << " adds " << ng << ", " <<
			 // ttaken << ", " << nxstop << ", " << stops[i+1] << endl;
		pq.push(mp( mp(ng, ttaken), mp(nxstop, stops[i+1]) ));
		
	}

	// cout << "ans before adding:  " << ans << endl;

	for (int i = 0; i < K-M; i++) {
		if (pq.size() == 0) break;
		pair<pil, pii> cur = pq.top(); pq.pop();

		ll numadd = cur.first.first;
		ll ctime = cur.first.second;
		ll cstop = cur.second.first;
		ll backend = cur.second.second;

		ans += numadd;
		ll nxstop = cstop + numadd;
		if (nxstop == backend) continue;

		ctime += C * (nxstop - cstop);
		if (ctime > T) continue;
		ll nguys = (T-ctime)/A;

		nguys = min(nguys, backend-nxstop-1LL);
		ll ng = nguys+1;

		// cout << "      another add: " << ng << ", " << ctime << 
		// 	", " << nxstop << ", " << backend << endl;
		pq.push(mp( mp(ng, ctime), mp(nxstop, backend)));

	}

	if (B*(N-1) <= T) {
		ans++;
	}
	cout << ans-1 << endl; //i think i count 0
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...