//Korzystam z algorytmu Bfs z książki Stańczyka "Algorytmika Praktyczna" #include <iostream> #include <vector> #include <string> #include <cstdio> #include <algorithm> 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(v,n) __typeof(n) v = (n) #define SIZE(x) ((int)(x).size()) #define FOREACH(i,c) for(VAR(i, (c).begin()); i != (c).end(); ++i) #define PB push_back template <class V, class E> struct Graph { struct Ed : E { int v; Ed(E p, int w) : E(p), v(w) { } }; struct Ve : V, vector<Ed> { }; vector<Ve> g; Graph(int n = 0) : g(n) { } void EdgeD(int b, int e, E d = E()) { g[b].PB(Ed(d, e)); } void EdgeU(int b, int e, E d = E()) { Ed eg(d, e); eg.rev = SIZE(g[e]) + (b==e); g[b].PB(eg); eg.rev = SIZE(g[eg.v = b]) - 1; g[e].PB(eg); } void Bfs(int s) { FOREACH(it, g) it->t = it->s = -1; g[s].t = 0; int qu[SIZE(g)], b, e; qu[b = e = 0] = s; while(b <= e) { s = qu[b++]; FOREACH(it, g[s]) if(g[it->v].t == -1) { g[qu[++e] = it->v].t = g[s].t + 1; g[it->v].s = s; } } } }; struct Ve { int rev; }; struct Vs { int t, s; }; int main() { int N; cin>>N; int p[200000]; Graph<Vs, Ve> g(N); for(int i=0; i<N; ++i) cin>>p[i]; for(int i=0; i<N; ++i) for(int j=i+1; j<N; ++j) { if(p[i] > p[j]) g.EdgeU(i,j); } for(int i=0; i<N; ++i) { g.Bfs(i); long long suma = 0; for(int x=0; x<N; ++x) { if(g.g[x].t != -1) suma += g.g[x].t; } cout<<suma<<" "; } cout<<endl; 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 | //Korzystam z algorytmu Bfs z książki Stańczyka "Algorytmika Praktyczna" #include <iostream> #include <vector> #include <string> #include <cstdio> #include <algorithm> 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(v,n) __typeof(n) v = (n) #define SIZE(x) ((int)(x).size()) #define FOREACH(i,c) for(VAR(i, (c).begin()); i != (c).end(); ++i) #define PB push_back template <class V, class E> struct Graph { struct Ed : E { int v; Ed(E p, int w) : E(p), v(w) { } }; struct Ve : V, vector<Ed> { }; vector<Ve> g; Graph(int n = 0) : g(n) { } void EdgeD(int b, int e, E d = E()) { g[b].PB(Ed(d, e)); } void EdgeU(int b, int e, E d = E()) { Ed eg(d, e); eg.rev = SIZE(g[e]) + (b==e); g[b].PB(eg); eg.rev = SIZE(g[eg.v = b]) - 1; g[e].PB(eg); } void Bfs(int s) { FOREACH(it, g) it->t = it->s = -1; g[s].t = 0; int qu[SIZE(g)], b, e; qu[b = e = 0] = s; while(b <= e) { s = qu[b++]; FOREACH(it, g[s]) if(g[it->v].t == -1) { g[qu[++e] = it->v].t = g[s].t + 1; g[it->v].s = s; } } } }; struct Ve { int rev; }; struct Vs { int t, s; }; int main() { int N; cin>>N; int p[200000]; Graph<Vs, Ve> g(N); for(int i=0; i<N; ++i) cin>>p[i]; for(int i=0; i<N; ++i) for(int j=i+1; j<N; ++j) { if(p[i] > p[j]) g.EdgeU(i,j); } for(int i=0; i<N; ++i) { g.Bfs(i); long long suma = 0; for(int x=0; x<N; ++x) { if(g.g[x].t != -1) suma += g.g[x].t; } cout<<suma<<" "; } cout<<endl; return 0; } |