#include <cstdio> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <set> #include <bitset> #include <map> #include <list> #include <stack> #include <queue> #include <deque> #include <complex> #include <iterator> #include <tr1/unordered_map> using namespace std; typedef vector<int> VI; typedef long long LL; #define FOR(x,b,e) for(int x=b; x<=(e); ++x) #define FORD(x,b,e) for(int x=b; x>=(e); --x) #define REP(x,n) for(int x=0; x<(n); ++x) #define VAR(x,n) __typeof(n) x = (n) #define ALL(c) (c).begin(), (c).end() #define SIZE(c) ((int)(c).size()) #define FOREACH(i,c) for(VAR(i, (c).begin()); i!=(c).end(); ++i) #define PB push_back #define PF push_front #define ST first #define ND second #define MP make_pair #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) #define N 2002 struct interval { int val; int beg; int end; }; struct comp { bool operator() (const interval& i1, const interval& i2){ if(i1.val != i2.val) return i1.val < i2.val; else if(i1.end != i2.end) return i1.end > i2.end; else return i1.beg < i1.beg; } } comp; interval priority[N*N]; map<int, int> space; int check(int a, int b){ map<int, int>::iterator it; while(1){ it = space.find(a); if(it==space.end()){ space.insert(it, MP(a,b)); return 1; } else { a = MIN(b, it->second); b = MAX(b, it->second); if(a==b) return 0; } } return 0; } int main(){ int n, rescount, k, act; LL res = 0; scanf("%d ", &n); k = 0; REP(i,n) FOR(j,i,n-1){ scanf("%d ", &priority[k].val); priority[k].beg = i; priority[k++].end = j; } sort(priority, priority+k, comp); rescount = act = 0; space.insert(MP(n,n)); while(rescount < n){ interval inter = priority[act++]; if(check(inter.beg,inter.end+1)){ res += inter.val; rescount++; } } printf("%lld\n", res); 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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include <cstdio> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <set> #include <bitset> #include <map> #include <list> #include <stack> #include <queue> #include <deque> #include <complex> #include <iterator> #include <tr1/unordered_map> using namespace std; typedef vector<int> VI; typedef long long LL; #define FOR(x,b,e) for(int x=b; x<=(e); ++x) #define FORD(x,b,e) for(int x=b; x>=(e); --x) #define REP(x,n) for(int x=0; x<(n); ++x) #define VAR(x,n) __typeof(n) x = (n) #define ALL(c) (c).begin(), (c).end() #define SIZE(c) ((int)(c).size()) #define FOREACH(i,c) for(VAR(i, (c).begin()); i!=(c).end(); ++i) #define PB push_back #define PF push_front #define ST first #define ND second #define MP make_pair #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) #define N 2002 struct interval { int val; int beg; int end; }; struct comp { bool operator() (const interval& i1, const interval& i2){ if(i1.val != i2.val) return i1.val < i2.val; else if(i1.end != i2.end) return i1.end > i2.end; else return i1.beg < i1.beg; } } comp; interval priority[N*N]; map<int, int> space; int check(int a, int b){ map<int, int>::iterator it; while(1){ it = space.find(a); if(it==space.end()){ space.insert(it, MP(a,b)); return 1; } else { a = MIN(b, it->second); b = MAX(b, it->second); if(a==b) return 0; } } return 0; } int main(){ int n, rescount, k, act; LL res = 0; scanf("%d ", &n); k = 0; REP(i,n) FOR(j,i,n-1){ scanf("%d ", &priority[k].val); priority[k].beg = i; priority[k++].end = j; } sort(priority, priority+k, comp); rescount = act = 0; space.insert(MP(n,n)); while(rescount < n){ interval inter = priority[act++]; if(check(inter.beg,inter.end+1)){ res += inter.val; rescount++; } } printf("%lld\n", res); return 0; } |