Pagini recente » Clasament lejer | Clasament tractoare2 | Istoria paginii runda/saaasssssss | Cod sursa (job #3221746) | Cod sursa (job #2280952)
#include <cstdio>
#include <algorithm>
#include <deque>
using namespace std;
FILE *f = fopen("huffman.in","r");
FILE *g = fopen("huffman.out","w");
const int NMAX = 1e6;
int n;
pair<int,int> sons[2 * NMAX + 5];
pair<int,int> ans[2 * NMAX + 5];
deque< pair<int,int> > q[2];
void dfs(int nod,int len,int val){
if(nod <= n){
ans[nod] = {len,val};
return ;
}
dfs(sons[nod].first,len + 1,val * 2);
dfs(sons[nod].second,len + 1,val * 2 + 1);
}
int main(){
fscanf(f,"%d",&n);
for(int i = 1;i <= n;i++){
int v;
fscanf(f,"%d",&v);
q[0].push_back({v,i});
}
for(int i = n + 1;i < 2 * n;i++){
int tmp = 1 << 30;
int x = -1,y = -1;
if(!q[0].empty() && !q[1].empty() && q[0][0].first + q[1][0].first < tmp){
tmp = q[0][0].first + q[1][0].first;
x = 0;
y = 1;
}
if((int)q[0].size() > 1 && q[0][0].first + q[0][1].first < tmp){
tmp = q[0][0].first + q[0][1].first;
x = y = 0;
}
if((int)q[1].size() > 1 && q[1][0].first + q[1][1].first < tmp){
tmp = q[1][0].first + q[1][1].first;
x = y = 1;
}
sons[i].first = q[x][0].second;
q[x].pop_front();
sons[i].second = q[y][0].second;
q[y].pop_front();
q[1].push_back({tmp,i});
}
dfs(2 * n - 1,0,0);
for(int i = 1;i <= n;i++){
fprintf(g,"%d %d\n",ans[i].first,ans[i].second);
}
fclose(f);
fclose(g);
return 0;
}