Submission #1235811

#TimeUsernameProblemLanguageResultExecution timeMemory
1235811M_SH_OSemiexpress (JOI17_semiexpress)C++20
100 / 100
146 ms588 KiB
/*#pragma GCC optimize("O3") #pragma GCC optimization("Ofast,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")*/ #include <bits/stdc++.h> /*#include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp>*/ #define ll long long #define ll1 long long #define ull unsigned long long #define dou long double #define str string #define vll vector<ll> #define vi vector<int> #define pll pair<ll, ll> #define vpll vector<pll> #define vbool vector<bool> #define vstr vector<str> #define vvll vector<vll> #define pb push_back #define pf push_front #define endl "\n" #define fr first #define se second // #define sortcmp(a) sort(a.begin(), a.end(), cmp) #define sort(a) sort(a.begin(), a.end()) #define reverse(a) reverse(a.begin(), a.end()) #define speed ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0) #define INF 1000000000000000000 #define ordered_set tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update> using namespace std; //using namespace __gnu_pbds; mt19937 rng(time(0)); ll randll(ll l, ll r) { return uniform_int_distribution<ll>(l, r)(rng); } int main(){ speed; srand(time(0)); ll n, m, k; cin >> n >> m >> k; ll a, b, c; cin >> a >> b >> c; ll d; cin >> d; vll v(m); map<ll, ll> dp; dp[1] = 0; ll pos = -1; for (int i =0 ; i < m; i ++) { cin >> v[i]; if (i > 0) dp[v[i]] = dp[v[i-1]]+(v[i]-v[i-1])*b; } ll res = 0; //cout << res << endl; for (; k > m; k --) { ll maxl = 0, x = -1, p_; pos = 1; auto it = dp.begin(); while (it != dp.end()) { pll p = *it; ll l = p.fr, r = n+1; if (it != --dp.end()) { auto it1 = it; it1 ++; r = (*it1).fr; } ll kin = r; while (r-l > 1) { ll md = (l+r)/2; if (p.se+(md-p.fr)*a <= d) l = md; else r = md; } if (r == kin) { it ++; continue; } ll dist = p.se+(r-p.fr)*c; ll p1 = r; r = kin; while (r-l > 1) { ll md = (l+r)/2; if (dist + (md-p1)*a <= d) l = md; else r = md; } if (l-p1+1 > maxl) { maxl = l-p1+1; x = p1; p_ = p.fr; } it ++; } //cout << x << endl; if (x == -1) break; dp[x] = dp[p_]+(x-p_)*c; } res = 0; auto it = dp.begin(); while (it != dp.end()) { pll p = *it; if (p.se > d) break; ll l = p.fr, r = n+1; if (it != --dp.end()) { auto it1 = it; it1 ++; r = (*it1).fr; } ll kin = r; while (r-l > 1) { ll md = (l+r)/2; if (p.se+(md-p.fr)*a <= d) l = md; else r = md; } res += l-p.fr+1; it ++; } cout << res-1 << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...