比賽的時候不知道小頂堆的概念,也不會手打堆,真實自閉。。
其實就是一道最小堆的模板題,套套板子就出來了。不過沒法提交,也不知道能不能拿滿。過兩天開一場重現賽試試
最小堆(小頂堆):父節點的值比他的兩個子節點的值都要小的堆
#include <iostream>
using namespace std;
int heap[10000],sz=0,n;
void push(int x)//向堆中插入x
{
int i=sz++;
while(i>0)
{
int p=(i-1)/2;
if(heap[p]<=x)
break;
heap[i]=heap[p];
i=p;
}
heap[i]=x;
}
int pop()
{
int ret=heap[0];
int x=heap[--sz];
int i=0;
while(i*2+1<sz)
{
int a=i*2+1,b=i*2+2;
if(heap[b]<sz&&heap[b]<heap[a])
a=b;
if(heap[a]>=x)
break;
heap[i]=heap[a];
i=a;
}
heap[i]=x;
heap[sz]=0;
return ret;
}
int findd(int x)//查找x在堆中的位置
{
for(int i=0; i<n; i++)
{
if(heap[i]==x)
return i;
}
}
void isroot(int x)//判斷x是否爲根
{
if(heap[0]==x)
cout<<"T"<<endl;
else
cout<<"F"<<endl;
}
void parent(int a,int b)//判斷a是否是b的父節點
{
int i=findd(a);
if(heap[i*2+1]==b||heap[i*2+2]==b)
cout<<"T"<<endl;
else
cout<<"F"<<endl;
}
void brother(int a,int b)//判斷a,b是否是兄弟節點
{
int i=findd(a);
if(i%2==0&&heap[i-1]==b)
cout<<"T"<<endl;
else if(i%2!=0&&heap[i+1]==b)
cout<<"T"<<endl;
else
cout<<"F"<<endl;
}
int main()
{
int m;
cin>>n>>m;
int i=0;
while(i++<n)
{
int a;
cin>>a;
push(a);
}
while(m--)
{
int a,b;
string c;
cin>>a>>c;
if(c=="and")
{
cin>>b;
cin>>c>>c;
brother(a,b);
}
else
{
cin>>c;
if(c=="a")
{
cin>>c>>c>>b;
parent(b,a);//判斷a是否是b的子節點等價於判斷b是否是a的父節點
}
else
{
cin>>c;
if(c=="root")
isroot(a);
else
{
cin>>c>>b;
parent(a,b);
}
}
}
}
return 0;
}