#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef struct _przedzial {
public:
unsigned poczatek, koniec, cena;
} przedzial;
bool myfunction (const przedzial & i,const przedzial & j) {
if(i.cena==j.cena){
if(i.poczatek==j.poczatek)
return i.koniec>j.koniec;
return i.poczatek>j.poczatek;
}
return i.cena<j.cena;
}
vector <przedzial> prze_vec;
int n;
int main () {
ios_base::sync_with_stdio (false);
cin >> n;
for(int i = 0;i<n;++i){
for(int j = i;j<n;++j){
przedzial _p;
_p.poczatek = j-i;
_p.koniec = j+1;
cin >> _p.cena;
prze_vec.push_back(_p);
}
}
sort(prze_vec.begin(), prze_vec.end(), myfunction);
vector <int> tab(n+1,-1);
int z = n;
unsigned long long index = 0;
unsigned long long calkowity_koszt = 0;
while(z>0){
int i = prze_vec[index].poczatek;
int j = prze_vec[index].koniec;
while(i<n){
if(tab[i]==-1){
tab[i] = j;
calkowity_koszt+=prze_vec[index].cena;
--z;
}
else{
if(tab[i]<j){
i = tab[i];
}
else{
if(tab[i]>j){
int tmp = j;
j = tab[i];
tab[i] = tmp;
i = tab[i];
}
else
break;
}
}
}
++index;
}
cout << calkowity_koszt;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include <iostream> #include <algorithm> #include <vector> using namespace std; typedef struct _przedzial { public: unsigned poczatek, koniec, cena; } przedzial; bool myfunction (const przedzial & i,const przedzial & j) { if(i.cena==j.cena){ if(i.poczatek==j.poczatek) return i.koniec>j.koniec; return i.poczatek>j.poczatek; } return i.cena<j.cena; } vector <przedzial> prze_vec; int n; int main () { ios_base::sync_with_stdio (false); cin >> n; for(int i = 0;i<n;++i){ for(int j = i;j<n;++j){ przedzial _p; _p.poczatek = j-i; _p.koniec = j+1; cin >> _p.cena; prze_vec.push_back(_p); } } sort(prze_vec.begin(), prze_vec.end(), myfunction); vector <int> tab(n+1,-1); int z = n; unsigned long long index = 0; unsigned long long calkowity_koszt = 0; while(z>0){ int i = prze_vec[index].poczatek; int j = prze_vec[index].koniec; while(i<n){ if(tab[i]==-1){ tab[i] = j; calkowity_koszt+=prze_vec[index].cena; --z; } else{ if(tab[i]<j){ i = tab[i]; } else{ if(tab[i]>j){ int tmp = j; j = tab[i]; tab[i] = tmp; i = tab[i]; } else break; } } } ++index; } cout << calkowity_koszt; return 0; } |
English