小顶堆建初堆:
void build(int v)
{
if(v*2==inf) return;
int minn=inf,tmp;
if(H[v*2]<minn) minn=H[tmp=v*2];
if(H[v*2+1]<minn) minn=H[tmp=v*2+1];//找到值最小的孩子节点
if(minn<H[v])//如果最小的孩子节点比当前节点小
{
swap(H[v],H[tmp]);//交换
build(tmp);//调整子树
}
}
for(int i=1;i<=n;i++)
scanf("%d",&H[i]);
for(int i=n;i>=1;i--)
build(i);
代码:
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
#define inf 1<<29
int n,m,H[4005];
int t[20005];
void build(int v)
{
if(v*2==inf) return;
int minn=inf,tmp;
if(H[v*2]<minn) minn=H[tmp=v*2];
if(H[v*2+1]<minn) minn=H[tmp=v*2+1];//找到值最小的孩子节点
if(minn<H[v])//如果最小的孩子节点比当前节点小
{
swap(H[v],H[tmp]);//交换
build(tmp);//调整子树
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=4000; i++)
H[i]=inf;
for(int i=1; i<=n; i++)
{
scanf("%d",&H[i]);
for(int j=i-1;j>=1;j--)
build(j);
}
memset(t,-1,sizeof t);
for(int i=1;i<=n;i++)
t[H[i]+10000]=i;
while(m--)
{
int u,v;
char str[10];
scanf("%d%s",&u,str);
u+=10000;
if(str[0]=='a')
{
scanf("%d%s%s",&v,str,str);
v+=10000;
if(t[u]==-1 || t[v]==-1) printf("F\n");
else if(t[v]%2 && t[u]+1==t[v]) printf("T\n");
else if(t[u]%2 && t[v]+1==t[u]) printf("T\n");
else printf("F\n");
}
else
{
scanf("%s",str);
if(str[0]=='a')
{
scanf("%s%s%d",str,str,&v);
v+=10000;
if(t[v]==-1 || t[u]==-1) printf("F\n");
else if(t[u]/2==t[v]) printf("T\n");
else printf("F\n");
}
else
{
scanf("%s",str);
if(str[0]=='r')
{
if(t[u]==-1) printf("F\n");
else if(t[u]==1) printf("T\n");
else printf("F\n");
}
else
{
scanf("%s%d",str,&v);
v+=10000;
if(t[u]==-1 || t[v]==-1) printf("F\n");
else if(t[v]/2==t[u]) printf("T\n");
else printf("F\n");
}
}
}
}
return 0;
}