堆--make_heap(), pop_heap(), push_heap()用法
小根堆:根小于儿子,左右儿子间并无大小关系要求,不要和搜索树搞混了
堆类似优先队列(就是优先队列),所以默认大者优先,重载小于号时,像优先队列一样考虑即可
堆是完全二叉树,插入元素时,先插入树的右下方,再进行上浮(移到合适的位置)
make_heap(), pop_heap(), push_heap() //创建,弹出,插入
堆一般和vector一起用
此题要询问节点间的关系,所以没用优先队列
~为取反操作,计算机内部的取反(全部取反)(^1是个位数取反)
-1在计算机内部是以补码的形式存在,它取反为0,其余数取反均不为0
str.find("abc"); //若找得到abc则返回的是a的位置,找不到则返回的是-1
#include<bits/stdc++.h>
using namespace std;
int const N=30+7;
int n,m;
struct L{
int a;
friend bool operator<(L a,L b){
return a.a > b.a ;
}
};
vector<L>v;
string str;
map<int,int>mp;
int pan(){
int z=0,i,f=1,fg=0;
for(i=0;i<str.size();++i){
if(str[i]=='-') f=-1,i++;
while(i<str.size()&&str[i]>='0'&&str[i]<='9') z=z*10+str[i]-'0',i++,fg=1;
if(fg) break;
}
if(fg&&i+1<str.size())str=str.substr(i+1);
return z*f;
}
int main(){
int x;
while(cin >> n >> m){
make_heap(v.begin(),v.end());
for(int i=1;i<=n;++i){
cin >> x;v.push_back((L){x});
push_heap(v.begin(),v.end());
}
for(int i=0;i<v.size();++i) mp[v[i].a]=i+1;//记录其位置
//cin.ignore();//
getchar();
while(m--){
int f=0;
getline(cin,str);
if(~str.find("root")){
int z=pan();
if(mp[z]==1) f=1;
else f=0;
}
else if(~str.find("siblings")){
int z1=pan(),z2=pan();
if(mp[z1]/2==mp[z2]/2) f=1;
else f=0;
}
else if(~str.find("parent")){
int z1=pan(),z2=pan();
if(mp[z1]==mp[z2]/2) f=1;
else f=0;
}
else if(~str.find("child")){
int z1=pan(),z2=pan();
if(mp[z1]/2==mp[z2]) f=1;
else f=0;
}
if(f) cout << "T\n";
else cout << "F\n";
}
}
return 0;
} 