Mai intai trebuie sa te autentifici.
Cod sursa(job #2573601)
Utilizator | Data | 5 martie 2020 18:19:19 | |
---|---|---|---|
Problema | Coduri Huffman | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.29 kb |
#include <bits/stdc++.h>
#define DIM 1000010
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
long long n,m,i,j,k,t,niv,cost,v[DIM],w[DIM],l[DIM],c[DIM];
pair<long long, pair<int,int> > L[2*DIM];
void dfs(int nod, long long cod) {
niv++;
if (nod>n)
cost+=L[nod].first;
else
c[nod]=cod, l[nod]=niv;
if (L[nod].first>0) {
dfs(L[nod].second.first,(cod<<1));
dfs(L[nod].second.second,(cod<<1)+1);
}
niv--;
}
int main() {
memset(v,1,sizeof(v));
memset(w,1,sizeof(w));
fin>>n;
for (i=1;i<=n;i++)
fin>>v[i];
i=j=1, k=n, t=2*k-1;
while (k<t) {
//alegem v[i] si v[i+1]
if (v[i+1]<=w[j]) {
L[++k]={v[i]+v[i+1],{i,i+1}};
w[++m]=v[i]+v[i+1];
i+=2;
}
//alegem w[j] si w[j+1]
else if (w[j+1]<=v[i]) {
L[++k]={w[j]+w[j+1],{n+j,n+j+1}};
w[++m]=w[j]+w[j+1];
j+=2;
}
//alegem v[i] si w[j]
else {
L[++k]={v[i]+w[j],{i,n+j}};
w[++m]=v[i]+w[j];
i++, j++;
}
}
niv=-1;
dfs(2*n-1,0);
fout<<cost<<"\n";
for (i=1;i<=n;i++)
fout<<l[i]<<" "<<c[i]<<"\n";
return 0;
}