题目链接
需要建立小顶堆,但是用数组模拟小顶堆有两种建法,两种方法都可以建成小顶堆,但是顺序是不一样的
1.第一种建法建出来的样例小顶堆(也就是我代码注释掉的那部分)
2.第二种建法建出来的样例小顶堆
两种建法虽然都能建出来小顶堆,但是还是有区别的。详细讲解请移步👉两种数组模拟建小根堆方法比较
这个题中是“插入”建立小根堆,同时没有要求左右儿子之间的大小关系,所以我们选择第一种建堆方法(两种建堆方法参考上面链接博客)
代码写得比较乱,还可以更简洁的,把判断数字(注意负数的判断)单独写一个函数会更短更简洁一些。
#include <bits/stdc++.h>
using namespace std;
int h[10010],n,cnt;
/*void down(int u)//第一种建堆方法(此题中错误,会有部分数据过不了)
{
int t=u;
if(h[t]>h[u*2]&&u*2<=n)
t=2*u;
if(h[t]>h[u*2+1]&&u*2+1<=n)
t=u*2+1;
if(u!=t)
{
swap(h[u],h[t]);
down(t);
}
return;
}*/
void create(int x)//此题中正确的建堆方法
{
h[++cnt]=x;
int t=cnt;
while(t>1&&h[t/2]>h[t])
{
h[t]=h[t/2];
h[t/2]=x;
t/=2;
}
h[t]=x;
}
int main()
{
int m;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
int x;
cin>>x;
create(x);
}
/*for(int i=n/2; i; i--)//第一种方法建堆
down(i);*/
/*for(int i=1; i<=n; i++)//打印堆,用来检验堆的正确性,debug的时候用的
printf("%d ",h[i]);*/
getchar();
while(m--)
{
int flag,ans,sum1,sum2,x,y,sum,f,g;
string a;
getline(cin,a);
flag=a.find(" is the root");
if(flag!=-1)
{
sum=0;
f=0;
if(a[0]=='-')
f=1;
if(f==1)
{
for(int i=1; i<flag; i++)
sum=sum*10+a[i]-'0';
sum=-sum;
}
else
{
for(int i=0; i<flag; i++)
sum=sum*10+a[i]-'0';
}
if(sum==h[1])
printf("T\n");
else
printf("F\n");
}
else
{
flag=a.find(" and ");
ans=a.find(" are siblings");
if(flag!=-1&&ans!=-1)
{
f=0;
g=0;
sum1=0;
sum2=0;
if(a[0]=='-')
f=1;
if(f==1)
{
for(int i=1; i<flag; i++)
sum1=sum1*10+a[i]-'0';
sum1=-sum1;
}
else
{
for(int i=0; i<flag; i++)
sum1=sum1*10+a[i]-'0';
}
if(a[flag+5]=='-')
g=1;
if(g==1)
{
for(int i=flag+6; i<ans; i++)
sum2=sum2*10+a[i]-'0';
sum2=-sum2;
}
else
{
for(int i=flag+5; i<ans; i++)
sum2=sum2*10+a[i]-'0';
}
for(int i=1; i<=n; i++)
{
if(h[i]==sum1)
x=i;
if(h[i]==sum2)
y=i;
}
if(x/2==y/2)
printf("T\n");
else
printf("F\n");
}
else
{
flag=a.find(" is the parent of ");
if(flag!=-1)
{
sum1=0;
sum2=0;
f=0;
g=0;
if(a[0]=='-')
f=1;
if(f==1)
{
for(int i=1; i<flag; i++)
sum1=sum1*10+a[i]-'0';
sum1=-sum1;
}
else
{
for(int i=0; i<flag; i++)
sum1=sum1*10+a[i]-'0';
}
if(a[flag+18]=='-')
g=1;
if(g==1)
{
for(int i=flag+19; i<a.size(); i++)
sum2=sum2*10+a[i]-'0';
sum2=-sum2;
}
else
{
for(int i=flag+18; i<a.size(); i++)
sum2=sum2*10+a[i]-'0';
}
for(int i=1; i<=n; i++)
{
if(h[i]==sum1)
x=i;
if(h[i]==sum2)
y=i;
}
if(y/2==x)
printf("T\n");
else
printf("F\n");
}
else
{
flag=a.find(" is a child of ");
sum1=0;
sum2=0;
f=0;
g=0;
if(a[0]=='-')
f=1;
if(f==1)
{
for(int i=1; i<flag; i++)
sum1=sum1*10+a[i]-'0';
sum1=-sum1;
}
else
{
for(int i=0; i<flag; i++)
sum1=sum1*10+a[i]-'0';
}
if(a[flag+15]=='-')
g=1;
if(g==1)
{
for(int i=flag+16; i<a.size(); i++)
sum2=sum2*10+a[i]-'0';
sum2=-sum2;
}
else
{
for(int i=flag+15; i<a.size(); i++)
sum2=sum2*10+a[i]-'0';
}
for(int i=1; i<=n; i++)
{
if(h[i]==sum1)
x=i;
if(h[i]==sum2)
y=i;
}
if(x/2==y)
printf("T\n");
else
printf("F\n");
}
}
}
}
return 0;
}