#include <algorithm> #include <iostream> #include <set> #include <vector> using namespace std; const int MAXN = 2001; long long c[MAXN][MAXN]; long long suma=0; struct Interval{ int l,r; Interval() {} Interval(int x,int y) : l(x),r(y) {} }; struct intervalCmp{ bool operator()(const Interval& A,const Interval& B){ return (c[A.l][A.r]==c[B.l][B.r]) ? &A<&B : c[A.l][A.r]<c[B.l][B.r]; } }; set<Interval,intervalCmp> intervals; bool zbior[MAXN][MAXN]; int b,e; Interval kol[MAXN*MAXN]; vector<int> pocz[MAXN],kon[MAXN]; int main(){ ios_base::sync_with_stdio(0); int n;cin>>n; for(int i=1;i<=n;++i){ for(int j=0;j<n+1-i;++j){ cin>>c[i][i+j]; Interval obj(i,i+j); intervals.insert(obj); } } b=0,e=-1; while(!intervals.empty()){ Interval obj = *intervals.begin(); intervals.erase(intervals.begin()); //zaktualizuj zbior if(!zbior[obj.l][obj.r]){ zbior[obj.l][obj.r]=true; kol[++e]=obj; while(b<=e){ Interval act = kol[b++]; for(vector<int>::iterator it=pocz[act.l].begin();it!=pocz[act.l].end();++it){ if(*it>act.r && !zbior[act.r+1][*it]){ zbior[act.r+1][*it]=true; kol[++e]=Interval(act.r+1,*it); }else if(*it<act.r && !zbior[*it+1][act.r]){ zbior[*it+1][act.r]=true; kol[++e]=Interval(*it+1,act.r); }else break; } for(vector<int>::iterator it=kon[act.r].begin();it!=kon[act.r].end();++it){ if(*it<act.l && !zbior[*it][act.l-1]){ zbior[*it][act.l-1]=true; kol[++e]=Interval(*it,act.l-1); }else if(*it>act.l && !zbior[act.l][*it-1]){ zbior[act.l][*it-1]=true; kol[++e]=Interval(act.l,*it-1); }else break; } for(vector<int>::iterator it=kon[act.l-1].begin();it!=kon[act.l-1].end();++it) if(!zbior[*it][act.r]){ zbior[*it][act.r]=true; kol[++e]=Interval(*it,act.r); }else break; for(vector<int>::iterator it2=pocz[act.r+1].begin();it2!=pocz[act.r+1].end();++it2) if(!zbior[act.l][*it2]){ zbior[act.l][*it2]=true; kol[++e]=Interval(act.l,*it2); }else break; pocz[act.l].push_back(act.r); kon[act.r].push_back(act.l); } suma+=c[obj.l][obj.r]; } } cout<<suma; 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 | #include <algorithm> #include <iostream> #include <set> #include <vector> using namespace std; const int MAXN = 2001; long long c[MAXN][MAXN]; long long suma=0; struct Interval{ int l,r; Interval() {} Interval(int x,int y) : l(x),r(y) {} }; struct intervalCmp{ bool operator()(const Interval& A,const Interval& B){ return (c[A.l][A.r]==c[B.l][B.r]) ? &A<&B : c[A.l][A.r]<c[B.l][B.r]; } }; set<Interval,intervalCmp> intervals; bool zbior[MAXN][MAXN]; int b,e; Interval kol[MAXN*MAXN]; vector<int> pocz[MAXN],kon[MAXN]; int main(){ ios_base::sync_with_stdio(0); int n;cin>>n; for(int i=1;i<=n;++i){ for(int j=0;j<n+1-i;++j){ cin>>c[i][i+j]; Interval obj(i,i+j); intervals.insert(obj); } } b=0,e=-1; while(!intervals.empty()){ Interval obj = *intervals.begin(); intervals.erase(intervals.begin()); //zaktualizuj zbior if(!zbior[obj.l][obj.r]){ zbior[obj.l][obj.r]=true; kol[++e]=obj; while(b<=e){ Interval act = kol[b++]; for(vector<int>::iterator it=pocz[act.l].begin();it!=pocz[act.l].end();++it){ if(*it>act.r && !zbior[act.r+1][*it]){ zbior[act.r+1][*it]=true; kol[++e]=Interval(act.r+1,*it); }else if(*it<act.r && !zbior[*it+1][act.r]){ zbior[*it+1][act.r]=true; kol[++e]=Interval(*it+1,act.r); }else break; } for(vector<int>::iterator it=kon[act.r].begin();it!=kon[act.r].end();++it){ if(*it<act.l && !zbior[*it][act.l-1]){ zbior[*it][act.l-1]=true; kol[++e]=Interval(*it,act.l-1); }else if(*it>act.l && !zbior[act.l][*it-1]){ zbior[act.l][*it-1]=true; kol[++e]=Interval(act.l,*it-1); }else break; } for(vector<int>::iterator it=kon[act.l-1].begin();it!=kon[act.l-1].end();++it) if(!zbior[*it][act.r]){ zbior[*it][act.r]=true; kol[++e]=Interval(*it,act.r); }else break; for(vector<int>::iterator it2=pocz[act.r+1].begin();it2!=pocz[act.r+1].end();++it2) if(!zbior[act.l][*it2]){ zbior[act.l][*it2]=true; kol[++e]=Interval(act.l,*it2); }else break; pocz[act.l].push_back(act.r); kon[act.r].push_back(act.l); } suma+=c[obj.l][obj.r]; } } cout<<suma; return 0; } |