This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
using namespace std;
#define forR(i, x) for(int i=0; i<(x); ++i)
#define REP(i, a, b) for(int i=(a); i<(b); ++i)
#define all(x) x.begin(), x.end()
#define boost() cin.sync_with_stdio(0); cin.tie(0)
typedef long long ll;
typedef vector<int> vi;
const int MK = 3010;
ll s[MK];
ll fe[MK];
ll a, b, c, t;
ll aCheck(ll fs) {
// i >= 1: a * i + fs <= t -> i <= (t-fs) / a
return (t-fs)/a;
}
struct interval{ int pe, ne; ll cp; };
ll amtNew(interval i) {
ll aCan = s[i.ne] - i.cp;
ll from = c * (i.cp - s[i.pe]) + fe[i.pe];
// i >= 0: a * i + from <= t -> i <= (t-from)/a
if(t >= from) return min(aCan, (t-from)/a + 1);
return 0;
}
bool operator <(interval p, interval q) {
return amtNew(p) < amtNew(q);
}
signed main() {
boost();
int n, m, k; cin >> n >> m >> k;
cin >> a >> b >> c;
cin >> t;
REP(i, 1, m+1) {
cin >> s[i];
fe[i] = b * (s[i] - s[1]);
}
int cnt = k - m;
ll tot = 0;
REP(i, 2, m+1) if(fe[i] <= t) {
++tot;
// cerr << s[i] << '\n';
}
priority_queue<interval> ivl;
REP(i, 1, m) {
if(fe[i] <= t) {
ll cr = aCheck(fe[i]);
ll ain = s[i+1] - s[i] - 1;
ll nCan = min(ain, cr);
tot += nCan;
// cerr << s[i] + 1 << ' ' << s[i] + nCan << '\n';
if(s[i] + nCan + 1 < s[i+1]) {
ivl.push({i, i+1, s[i] + nCan + 1});
}
}
}
forR(j, cnt) if(!ivl.empty()) {
interval bes = ivl.top();
ivl.pop();
ll inc = amtNew(bes);
if(inc > 0) {
// cerr << bes.cp << ' ' << bes.cp + inc - 1 << '\n';
tot += inc;
if(bes.cp + inc < s[bes.ne]) {
ivl.push({bes.pe, bes.ne, bes.cp + inc});
}
}
}
cout << tot << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |