//维持最小堆
//调整
void down(int p)
{
int q=p*2;
a=heap[p];
while(q<=hlength)
{
if(q<hlenth&&heap[q]>heap[q+1])//寻找当前子节点中较小的那个
{
q++;
}
if(heap[q]>=a)//若较小的那个较大则结束
break;
else
{
heap[p]=heap[q];//交换位置
p=q;
q=p*2;
}
}
heap[p]=a;//安排原来的节点
}
//删除最小元素,并且返回其值
int DelteMin()
{
int r=heap[1];
heap[1]=heap[hlength-1];//将最后一个节点赋值给根节点
down(1);
return r;
}
//插入一个元素,先添加到末尾,在向上调整
void up(int p)
{
int q=p/2;
a=heap[p];
while(q>=1&&a<heap[q])//当前的节点比父母值小则交换
{
heap[p]=heap[q];
p=q;
q=p/2;
}
heap[p]=a;
}
void insert(int a)
{
heap[++hlength]=a;
up(hlength);
}
//将x的优先级上升为P
void IncreaseKey(int p,int a)
{
//将p的优先级s上升为a
if(heap[p]<a)
return ;
heap[p]=a;
up(p);
}
//建堆
void build()
{
for(int i=hlength/2;i>0;i--)
down(i);
}
poj2051
http://poj.org/problem?id=2051
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int now;
int perid;
int num;
};
node nodes[10009];
int len;
void down(int p)
{
node tt=nodes[p];
int q=p*2;
while(q<=len)
{
if(q<len&&nodes[q].now>nodes[q+1].now
||q<len&&nodes[q].now==nodes[q+1].now&&nodes[q+1].num<nodes[q].num) q++;
if(tt.now<nodes[q].now||
tt.now==nodes[q].now&&nodes[q].num>tt.num) break;
nodes[p]=nodes[q];
p=q;
q=q<<1;
}
nodes[p]=tt;
}
void makeTree()
{
for(int i=len/2; i>0; i--)
down(i);
}
int main()
{
char s[30];
len=0;
while(~scanf("%s",s))
{
if(strcmp(s,"#")==0) break;
len++;
scanf("%d%d",&nodes[len].num,&nodes[len].perid);
nodes[len].now=nodes[len].perid;
}
int k;
scanf("%d",&k);
makeTree();
for(int i=0; i<k; i++)
{
printf("%d\n",nodes[1].num);
nodes[1].now+=nodes[1].perid;
down(1);
}
return 0;
}