Pagini recente » Cod sursa (job #2824683) | Cod sursa (job #207105) | Cod sursa (job #1855580) | Cod sursa (job #3138166) | Cod sursa (job #492492)
Cod sursa(job #492492)
using namespace std;
#include<fstream>
const int MAX_N = 1000007;
const int oo = 0x3f3f3f3f;
#define ll long long
int V[2*MAX_N], lg[MAX_N], poz[MAX_N];
ll val[MAX_N];
int fs[2*MAX_N], fd[2*MAX_N], N, K;
int C[2*MAX_N], P, Q, U, SOL;
void DFS(int X, int h, ll nr)
{
if(!X) return;
if( X <= N )
{
lg[X] = h;
val[X] = nr;
}
DFS( fs[X], h + 1, nr + (1<<h) );
DFS( fd[X], h + 1, nr );
}
int main()
{
ifstream in("huffman.in"); ofstream out("huffman.out");
in>>N;
int i, X, Y;
for(i = 1; i <= N; ++i) in>>V[i];
Q = 1;
V[0] = oo;
for(i = N + 1; i < 2*MAX_N; ++i) V[i] = oo;
K = N + 1; P = 1;
while( ( N - Q + 1 + U - P + 1 ) > 1 )
{
if( V[Q] < V[ C[P ] ] )
{
X = Q;
if( V[Q+1] < V[ C[P] ] ) Y = Q + 1, ++Q;
else Y = C[P], ++P;
++Q;
}
else
{
X = C[P];
if( V[Q] < V[ C[P+1] ] ) Y = Q, ++Q;
else Y = C[P+1], ++P;
++P;
}
++K;
V[K] = V[X] + V[Y];
if( V[X] == oo || V[Y] == oo ) break; //{ out<<K<<" " <<X<<" "<<Y<<"\n"; }
SOL += V[K];
fs[K] = X; fd[K] = Y;
C[++U] = K;
}
DFS( K, 0, 0 );
// for(i = 1; i <= K; ++i) out<<V[i]<<" ";
// out<<"\n"<<K<<"\n";
out<<SOL<<"\n";
for(i = 1; i <= N; ++i)
out<<lg[i]<<" "<<val[i]<<"\n";
}