#include<algorithm> //#include<stdio.h> #include<iostream> #include<list> #include<map> #include<queue> #define FOR(i,n) for(int i = 0;i<n;++i) #define FORI(i,b,n) for(int i = b;i<n;++i) #define FORD(i,n) for(int i = n;i>=0;--i) #define ZERO 0.000001 #define MAX ((1<<31)-1) #define qprintf debug && printf #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) #define ull long long int using namespace std; #define POINTER_TO(i,j) (&(t[(i)][(j)-(i)-1])) class Range { public: int from; int to; int price; int alive; list<Range*> back; }; struct RC { bool operator() (const Range* a, const Range* b){return a->price < b->price;} }; void markAndFollow(Range*r){ if(r->alive==2)return; r->alive=2; while(!r->back.empty()){ Range*f=r->back.front(); r->back.pop_front(); markAndFollow(f); } } int main(){ ios_base::sync_with_stdio(0); int n; cin>>n;//scanf("%d",&n); Range**t=new Range*[n]; int nn=(n*(n+1))/2; *t=new Range[nn]; FOR(i,n){ t[i]=*t+i*(n+n+1-i)/2; } Range**q=new Range*[nn]; int y=0; FOR(i,n){ FORI(j,i,n){ int p; cin>>p;//scanf("%d",&p); int ji=j-i; t[i][ji].alive=1; t[i][ji].price=p; t[i][ji].from=i; t[i][ji].to=j+1; q[y]=&(t[i][ji]); ++y; } } RC cmp; sort(q,q+nn,cmp); ull p=0; FOR(u,nn){ Range*r=q[u]; if(r->alive!=1)continue; p+=r->price; markAndFollow(r); FOR(i,n+1){ if(i==r->from || i==r->to)continue; Range*cheaper; Range*third; if(i<r->from){ cheaper=POINTER_TO(i,r->from); third=POINTER_TO(i,r->to); }else if(r->from<i && i<r->to){ cheaper=POINTER_TO(r->from,i); third=POINTER_TO(i,r->to); }else if(i>r->to){ cheaper=POINTER_TO(r->from,i); third=POINTER_TO(r->to,i); } if(cheaper->alive==2 || third->alive==2){ markAndFollow(cheaper); markAndFollow(third); continue; } if(cheaper->price>third->price){ if(third->alive==1) swap(cheaper,third); } third->alive=0; third->back.push_back(cheaper); cheaper->back.push_back(third); } } cout<<p<<endl;;//printf("%llu\n",p); 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 104 105 106 107 | #include<algorithm> //#include<stdio.h> #include<iostream> #include<list> #include<map> #include<queue> #define FOR(i,n) for(int i = 0;i<n;++i) #define FORI(i,b,n) for(int i = b;i<n;++i) #define FORD(i,n) for(int i = n;i>=0;--i) #define ZERO 0.000001 #define MAX ((1<<31)-1) #define qprintf debug && printf #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) #define ull long long int using namespace std; #define POINTER_TO(i,j) (&(t[(i)][(j)-(i)-1])) class Range { public: int from; int to; int price; int alive; list<Range*> back; }; struct RC { bool operator() (const Range* a, const Range* b){return a->price < b->price;} }; void markAndFollow(Range*r){ if(r->alive==2)return; r->alive=2; while(!r->back.empty()){ Range*f=r->back.front(); r->back.pop_front(); markAndFollow(f); } } int main(){ ios_base::sync_with_stdio(0); int n; cin>>n;//scanf("%d",&n); Range**t=new Range*[n]; int nn=(n*(n+1))/2; *t=new Range[nn]; FOR(i,n){ t[i]=*t+i*(n+n+1-i)/2; } Range**q=new Range*[nn]; int y=0; FOR(i,n){ FORI(j,i,n){ int p; cin>>p;//scanf("%d",&p); int ji=j-i; t[i][ji].alive=1; t[i][ji].price=p; t[i][ji].from=i; t[i][ji].to=j+1; q[y]=&(t[i][ji]); ++y; } } RC cmp; sort(q,q+nn,cmp); ull p=0; FOR(u,nn){ Range*r=q[u]; if(r->alive!=1)continue; p+=r->price; markAndFollow(r); FOR(i,n+1){ if(i==r->from || i==r->to)continue; Range*cheaper; Range*third; if(i<r->from){ cheaper=POINTER_TO(i,r->from); third=POINTER_TO(i,r->to); }else if(r->from<i && i<r->to){ cheaper=POINTER_TO(r->from,i); third=POINTER_TO(i,r->to); }else if(i>r->to){ cheaper=POINTER_TO(r->from,i); third=POINTER_TO(r->to,i); } if(cheaper->alive==2 || third->alive==2){ markAndFollow(cheaper); markAndFollow(third); continue; } if(cheaper->price>third->price){ if(third->alive==1) swap(cheaper,third); } third->alive=0; third->back.push_back(cheaper); cheaper->back.push_back(third); } } cout<<p<<endl;;//printf("%llu\n",p); return 0; } |