补充并查集的初始化:
for(int i=0;i<n;i++)
p[i]=i; size[i]=1;
#include <iostream>
#include <algorithm>
using namespace std;
const int N=100010;
int n,m; int h[N],size;
//down的操作流程;
int down(int u)
{
int t=u;
if(2*u<=size&&h[2*u]<=h[t]) t=2*u;
if(2*u+1<=size&&h[2*u+1]<=h[t]) t=2*u+1;
if(u!=t) swap(h[u],h[t]);
down(t);
}
// up的操作流程;
int up(int u)
{
if(u/2&&h[[u/2]>=h[u])swap(h[u/2],h[u]);
u/=2;
}
//堆的排序;
scanf(“%d%d”,&n,&m);
for(int i=0;i<n;i++)scamf("%d",&h[i]);
size=n;
for(int i = n/2;i>0;i--){ down(i); }