堆--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;
} 
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务