Pagini recente » Cod sursa (job #582155) | Cod sursa (job #1919528) | Cod sursa (job #628688) | Cod sursa (job #696873) | Cod sursa (job #824849)
Cod sursa(job #824849)
#include<stdio.h>
#include<queue>
using namespace std;
FILE *f = fopen("huffman.in","r");
FILE *g = fopen("huffman.out","w");
typedef struct _nod
{
long long info;
int F[2];
} nod;
#define MaxN 1000100
#define MaxP 2
#define ll long long
int N;
ll Sol,SolV[MaxN][MaxP];
nod A[(MaxN<<1)+100];
void citire(void)
{
int a;
fscanf(f,"%d ",&N);
for(int i=1;i<=N;i++)
fscanf(f,"%lld",&A[i].info);
}
inline void creare(int poz,int depth,int nr)
{
if(poz <= N)
{
SolV[poz][0] = depth;
SolV[poz][1] = nr;
return ;
}
creare(A[poz].F[0],depth+1,nr*2);
creare(A[poz].F[1],depth+1,nr*2+1);
}
void Rezolvare(void)
{
int pozA = 1,pozB = N+1,pozNOU = N,pozF;
ll min;
for(int i=1;i<N;i++)
{
if(pozA > N || (pozB <= pozNOU && A[pozA].info > A[pozB].info))
min = A[pozB].info,pozF = pozB++;
else
min = A[pozA].info,pozF = pozA++;
A[pozNOU+1].info = min; A[pozNOU+1].F[0] = pozF;
if(pozA > N || (pozB <= pozNOU && A[pozA].info > A[pozB].info))
min = A[pozB].info,pozF = pozB++;
else
min = A[pozA].info,pozF = pozA++;
A[pozNOU+1].info += min; A[pozNOU+1].F[1] = pozF;
Sol += A[++pozNOU].info;
}
creare(pozNOU,0,0);
}
int main()
{
citire();
Rezolvare();
fprintf(g,"%lld\n",Sol);
for(int i=1;i<=N;i++)
fprintf(g,"%lld %lld\n",SolV[i][0],SolV[i][1]);
}