小顶堆大顶堆

来源:互联网 发布:淘宝直播自我介绍文字 编辑:程序博客网 时间:2024/06/08 08:24

L2-012. 关于堆的判断

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:

  • “x is the root”:x是根结点;
  • “x and y are siblings”:x和y是兄弟结点;
  • “x is the parent of y”:x是y的父结点;
  • “x is a child of y”:x是y的一个子结点。

输入格式:

每组测试第1行包含2个正整数N(<= 1000)和M(<= 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。

输出格式:

对输入的每个命题,如果其为真,则在一行中输出“T”,否则输出“F”。

输入样例:
5 446 23 26 24 1024 is the root26 and 23 are siblings46 is the parent of 2323 is a child of 10
输出样例:
FTFT
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<algorithm>using namespace std;int l,n,m,a[1010];void A(int index){    int t=a[index];    int j=index;    while(j>1&&a[j/2]>t)   //a[j/2]<t及为大顶堆    {        a[j]=a[j/2];        j/=2;    }    a[j]=t;}void Q(int y){    a[l++]=y;    A(l-1);}int main (){    int x,ky;    l=1;    string str;    map<int,int> vis;    scanf("%d %d",&n,&m);    for(int i=0;i<n;i++)    {       scanf("%d",&x);       Q(x);    }    for(int i=1;i<l;i++)    {         vis[a[i]]=i;        //cout<<a[i]<<" ";    }    for(int i=0;i<m;i++)    {       cin>>ky;       int xb=vis[ky];       cin>>str;       if(str[0]=='a')       {           cin>>ky;           getline(cin,str);           int xb1=vis[ky];           if(xb/2==xb1/2)           cout<<"T"<<endl;           else           cout<<"F"<<endl;       }       else       {           cin>>str;           cin>>str;           if(str[0]=='r')           {              if(xb==1)              cout<<"T"<<endl;              else              cout<<"F"<<endl;           }           else if(str[0]=='p')           {                cin>>str;                cin>>ky;                int xb1=vis[ky];                if(xb1/2==xb)                cout<<"T"<<endl;                else                cout<<"F"<<endl;           }           else           {               cin>>str;               cin>>ky;               int xb1=vis[ky];                if(xb1==xb/2)                cout<<"T"<<endl;                else                cout<<"F"<<endl;           }       }    }    system("pause");    return 0;}

1 0
原创粉丝点击