堆--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; }