#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; } |
English