Pagini recente » Cod sursa (job #2585580) | Cod sursa (job #663727) | Cod sursa (job #2902803) | Cod sursa (job #1508791) | Cod sursa (job #830784)
Cod sursa(job #830784)
#include<stdio.h>
#include<fstream>
using namespace std;
ifstream f("huffman.in");
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
#define sh short int
#define MaxS (MaxN*10)
int N;
ll Sol;
sh SolVA[MaxN];
ll SolVB[MaxN];
char S[MaxS];
nod A[(MaxN<<1)+100];
void citire(void)
{
int nr = 0;
f >> N;
f.getline(S,MaxS,EOF);
for(int i=0;S[i];i++)
if(isdigit(S[i]))
for(++nr;isdigit(S[i]);A[nr].info = A[nr].info*10+S[i++]-'0');
}
inline void creare(int poz,sh depth,ll nr)
{
if(poz <= N)
{
SolVA[poz] = depth;
SolVB[poz] = 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,0LL);
}
int main()
{
citire();
Rezolvare();
fprintf(g,"%lld\n",Sol);
for(int i=1;i<=N;i++)
fprintf(g,"%hd %lld\n",SolVA[i],SolVB[i]);
}