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