#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<utility>
using namespace std;
#define FOR(I,A,B) for(int I=(A);I<=(B);I++)
#define REP(I,N) for(int I=0;I<(N);I++)
#define ALL(X) (X).begin(),(X).end()
#define PB push_back
#define MP make_pair
#define f first
#define s second
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef long long ll;
typedef vector<string> VS;
const int MAX = 2005;
int wsk[MAX];
vector < pair<int,pair<int,int> > > T;
vector < PII > base;
bool pos[MAX][MAX];
void update(PII &i, int idx){
pos[i.f][i.s] = true;
i.f = min(i.s,base[idx].s) + 1;
i.s = max(i.s,base[idx].s);
}
int main(){
int n,a;
scanf("%d",&n);
REP(i,n)
REP(j,n-i){
scanf("%d",&a);
T.PB(MP(a,MP(i,i+j)));
}
sort(ALL(T));
REP(i,n) wsk[i] = -1;
ll res = 0;
for(int j=0; j<T.size(); ++j){
auto i = T[j].s;
bool ok = true;
while(wsk[i.f] != -1){
if(pos[i.f][i.s]) break;
update(i,wsk[i.f]);
if(i.f>i.s){
ok = false;
break;
}
}
if(ok&&wsk[i.f] == -1){
res += T[j].f;
wsk[i.f] = base.size();
pos[i.f][i.s] = true;
base.PB(i);
}
if(base.size() == n) break;
}
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 | #include<iostream> #include<cstdio> #include<string> #include<cmath> #include<vector> #include<map> #include<set> #include<algorithm> #include<utility> using namespace std; #define FOR(I,A,B) for(int I=(A);I<=(B);I++) #define REP(I,N) for(int I=0;I<(N);I++) #define ALL(X) (X).begin(),(X).end() #define PB push_back #define MP make_pair #define f first #define s second typedef vector<int> VI; typedef pair<int,int> PII; typedef long long ll; typedef vector<string> VS; const int MAX = 2005; int wsk[MAX]; vector < pair<int,pair<int,int> > > T; vector < PII > base; bool pos[MAX][MAX]; void update(PII &i, int idx){ pos[i.f][i.s] = true; i.f = min(i.s,base[idx].s) + 1; i.s = max(i.s,base[idx].s); } int main(){ int n,a; scanf("%d",&n); REP(i,n) REP(j,n-i){ scanf("%d",&a); T.PB(MP(a,MP(i,i+j))); } sort(ALL(T)); REP(i,n) wsk[i] = -1; ll res = 0; for(int j=0; j<T.size(); ++j){ auto i = T[j].s; bool ok = true; while(wsk[i.f] != -1){ if(pos[i.f][i.s]) break; update(i,wsk[i.f]); if(i.f>i.s){ ok = false; break; } } if(ok&&wsk[i.f] == -1){ res += T[j].f; wsk[i.f] = base.size(); pos[i.f][i.s] = true; base.PB(i); } if(base.size() == n) break; } printf("%lld\n",res); return 0; } |
English