#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
struct triple {
unsigned short a,b;
int c;
triple(unsigned short a, unsigned short b, int c) :
a(a), b(b), c(c) {}
bool operator< (const triple& o) const {
return c < o.c;
}
};
long long solve(size_t N, vector<triple>& T) {
sort(T.begin(), T.end());
vector<bool> S((N+1)*(N+1), false);
long long cost=0;
vector<unsigned short> ends(N+1, 0);
for(auto& t : T) {
//cerr << t.a << " " << t.b << " " << t.c << endl;
unsigned short a = t.a;
unsigned short b = t.b;
while (a<=b and ends[b]>0) {
//cerr << " " << a << " " << b << endl;
if (S[(N+1)*a+b]) {
a = b+1;
break;
}
S[(N+1)*a+b] = true;
if (ends[b] < a) {
auto c = ends[b];
b = a-1;
a = c;
} else
b = ends[b]-1;
}
if (a>b)
continue;
if (a>1 and ends[a-1] > 0)
a = ends[a-1];
//cerr << " ADD " << a << " " << b << " " << t.c << endl;
ends[b] = a;
cost += t.c;
}
return cost;
}
void onecase() {
size_t N;
cin >> N;
vector<triple> T;
for(size_t i=1;i<=N;i++)
for(size_t j=i;j<=N;j++) {
int c;
cin >> c;
T.emplace_back(i,j,c);
}
cout << solve(N, T) << endl;
}
int main() {
ios_base::sync_with_stdio(false);
onecase();
/*
size_t Z;
cin >> Z;
while(Z--)
onecase();
*/
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 69 70 71 72 73 | #include <algorithm> #include <iostream> #include <vector> using namespace std; struct triple { unsigned short a,b; int c; triple(unsigned short a, unsigned short b, int c) : a(a), b(b), c(c) {} bool operator< (const triple& o) const { return c < o.c; } }; long long solve(size_t N, vector<triple>& T) { sort(T.begin(), T.end()); vector<bool> S((N+1)*(N+1), false); long long cost=0; vector<unsigned short> ends(N+1, 0); for(auto& t : T) { //cerr << t.a << " " << t.b << " " << t.c << endl; unsigned short a = t.a; unsigned short b = t.b; while (a<=b and ends[b]>0) { //cerr << " " << a << " " << b << endl; if (S[(N+1)*a+b]) { a = b+1; break; } S[(N+1)*a+b] = true; if (ends[b] < a) { auto c = ends[b]; b = a-1; a = c; } else b = ends[b]-1; } if (a>b) continue; if (a>1 and ends[a-1] > 0) a = ends[a-1]; //cerr << " ADD " << a << " " << b << " " << t.c << endl; ends[b] = a; cost += t.c; } return cost; } void onecase() { size_t N; cin >> N; vector<triple> T; for(size_t i=1;i<=N;i++) for(size_t j=i;j<=N;j++) { int c; cin >> c; T.emplace_back(i,j,c); } cout << solve(N, T) << endl; } int main() { ios_base::sync_with_stdio(false); onecase(); /* size_t Z; cin >> Z; while(Z--) onecase(); */ return 0; } |
English