大(小)根堆
作者:
略略略_3
,
2022-03-22 21:09:52
,
所有人可见
,
阅读 158
大(小)根堆
void UP(int p)
{
while(p>1) //大于
{
if(tree[p] > tree[p/2])
{
swap(tree[p] , tree[p/2]);
p /= 2;
}
else break;
}
}
void Down(int p)
{
int s = p*2;
while(s<=n)
{
if(s<n && tree[s] < tree[s+1]) ++s;
if(tree[p] > tree[s])
{
swap(tree[p] , tree[s]);
p = s , s = s*2;//left_son
}
else break;
}
}
void Insert(int x)
{
tree[++n] = x;
UP(n);
}
void Delete_top()
{
tree[1] = tree[n--];
Down(1);
}
void Delete_k(int k)
{
tree[k] = tree[n-1];
UP(k) , Down(k);
}