Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <vector>
- #include <iostream>
- #include <deque>
- using namespace std;
- using ll = long long;
- constexpr ll dist(const ll a, const ll b){
- return (a > b) ? a-b : b-a; }
- ll suma_secv(const vector<ll>& s_part, const ll a, const ll b){
- return s_part[b+1] - s_part[a]; }
- void citeste_date(vector<ll>& s_part, ll& k, ll& s, vector<ll>& rez_init){
- ifstream f("secvbest.in");
- ll n = 0;
- f >> n >> k >> s;
- s_part.resize(n+1, 0);
- rez_init.resize(n, 0);
- for(ll i = 1; i <= n; ++i){
- f >> s_part[i];
- s_part[i] += s_part[i-1];
- rez_init[i-1] = dist(s, s_part[i]); } }
- ll cost_asociat(const vector<ll>& rez_cur, const vector<ll>& s_part, const ll x, const ll i, const ll s){
- return rez_cur[x-1] + dist(suma_secv(s_part, x, i), s); }
- void fa_rand(const vector<ll>& s_part,
- const vector<ll>& rez_cur, const ll s,
- const ll k, vector<ll>& rez_next){
- ll optim_stang = k-1;
- rez_next[k-1] = cost_asociat(rez_cur, s_part, k-1, k-1, s);
- deque<ll> dreapta;
- for(ll i = k, gr = k; i < rez_cur.size(); ++i){
- while((!dreapta.empty()) &&
- cost_asociat(rez_cur, s_part, dreapta.back(), i, s) >
- cost_asociat(rez_cur, s_part, i, i, s)){
- dreapta.pop_back(); }
- dreapta.push_back(i);
- while(suma_secv(s_part, gr, i) > s){
- if(cost_asociat(rez_cur, s_part, optim_stang, i, s) >
- cost_asociat(rez_cur, s_part, gr, i, s)){
- optim_stang = gr; }
- if((!dreapta.empty()) && dreapta.front() == gr){
- dreapta.pop_front(); }
- ++gr; }
- rez_next[i] = min(cost_asociat(rez_cur, s_part, dreapta.front(), i, s),
- cost_asociat(rez_cur, s_part, optim_stang, i, s)); } }
- int main(){
- ll s, k;
- vector<ll> s_part, rez_cur;
- citeste_date(s_part, k, s, rez_cur);
- vector<ll> rez_next(rez_cur.size());
- ofstream g("secvbest.out");
- g << rez_cur.back() << ' ';
- for(ll i = 2; i <= k; ++i){
- fa_rand(s_part, rez_cur, s, i, rez_next);
- g << rez_next.back() << ' ';
- swap(rez_cur, rez_next); }
- return 0; }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement