Submission #1280951

#TimeUsernameProblemLanguageResultExecution timeMemory
1280951thirdSemiexpress (JOI17_semiexpress)C++20
100 / 100
103 ms103172 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pii pair<ll, ll>
#define fi first
#define se second
#define endl '\n'
#define TASK ""
#define N 9000006
#define LOG 17
using namespace std;

bool ghuy4g;

ll n, m, k;
ll A, B, C, T, s[3005], mxx[3005], lst;

int cha[N], noi[N];
bool vst[N];

vector<ll> vt;

void sub1() {
	for (int i = 1; i <= m; i ++) {
		ll used = (s[i] - 1) * B;
		if (used > T) break;
		lst = i;
		ll tiep = (T - used) / A;
		mxx[i] = s[i] + tiep;
		//cout << i << " mxx " << mxx[i] << endl;
	}
	//return;
	ll ans = 0;
	for (int i = 1; i <= lst; i ++) {
		ll rmax = mxx[i];
		ll j = i;
		while (j <= lst && rmax >= s[j]) {
			rmax = max(rmax, mxx[j]);
			j ++ ;
		}
		rmax = min(rmax, n);
		ans += (rmax - s[i] + 1);
		if (rmax == n) {
			break;
		}
		//cout << "i rmax " << s[i] << " " << rmax << endl;
		// dat o rmax + 1
		ll used = (s[j - 1] - 1) * B + (rmax + 1 - s[j - 1]) * C;
		ll prev = rmax, parent = -1, dem = 0;
		while (used <= T) {
			dem ++;
			if (dem > 3000) break;
			ll nhay = (T - used) / A + 1; // dung dc 1 cai la chinh dinh do, nhay: nhay dc bao nhieu con tu con prev
			ll den = min(prev + nhay, s[j] - 1);
			ll dung = den - prev;
			//cout << i << " " << prev << " " << used << " " << dung << endl;
			cha[vt.size()] = parent;
			if (parent != -1) {
				vst[parent] = 1;
				noi[parent] = vt.size();
			}
			vt.push_back(dung);
			parent = vt.size() - 1;
			used += ((den + 1) - (prev + 1)) * C;
			prev = den;
			if (den == s[j] - 1) {
				break;
			}
		}
		i = j - 1;
	}
	
	ll cnt = k - m;
	priority_queue<pii> pq;
	
	for (int i = 0; i < vt.size(); i ++) {
		ll it = vt[i];
		if (cha[i] == -1) {
			pq.push({it, i});
		}
	}
	
	while (pq.size() && cnt > 0) {
		auto it = pq.top();
		pq.pop();
		ans += it.fi;
		cnt -- ;
		if (vst[it.se]) {
			pq.push({vt[noi[it.se]], noi[it.se]});
		}
	}
	cout << ans - 1;
}

bool klinh;

signed main() {
   // freopen("test.inp", "r", stdin);
	//freopen("test.out", "w", stdout);
	//srand(time(0));
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
   	cin >> n >> m >> k;
   	cin >> A >> B >> C;
   	
   	cin >> T;
   	
   	for (int i = 1; i <= m; i ++) {
   		cin >> s[i];
   	}
   	
   	
   	sub1();
   	
   	cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...