建堆

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 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10
输出样例:
F
T
F
T
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[100100],n,k;


/*void unite(int a[],int x)
{
    int life=x*2,right=x*2+1;
    int keep=x;
    if(life>n||right>n)
    {
        return ;
    }
    if(life<=n&&a[keep]>a[life])
    {
        keep=life;
    }
     if(right<=n&&a[keep]>a[right])
    {
        keep=right;
    }
    if(x!=keep)
    {
        swap(a[keep],a[x]);
    }
    unite(a,life);
    unite(a,right);
}

void build(int a[])
{
    for(int i=n/2;i>0;i--)
    {
        unite(a,i);
    }
}*/

void Change_heap(int i , int len)
{
    int left = i * 2;
    int right = i * 2 + 1;
    int tmp = a[i];
    if(left <= len)
    {
        if(a[i] > a[left])
        {
            int aa = a[i];
            a[i] = a[left];
            a[left] = aa;
            Change_heap(left , len);
        }
    }
    if(right <= len)
    {
        if(a[i] > a[right])
        {
            int aa = a[i];
            a[i] = a[right];
            a[right] = aa;
            Change_heap(right , len);
        }
    }
}
void Build_heap(int len)
{
    for(int i = len / 2 ; i >= 1 ; --i)
    {
        Change_heap(i,len);
    }
}

int main()
{
   scanf("%d%d",&n,&k);
   for(int i=1;i<=n;i++)
      {
          scanf("%d",&a[i]);
          Build_heap(i);
      }
   //for(int i=1;i<=n;i++)
    //printf("%d ",a[i]);
   while(k--)
   {
       int num1,num2;
       char str[100100],str1[100100],str2[100100],str3[100100],str4[100100];
       cin>>num1>>str;
        int flag=0;
       if(str[0]=='a')
       {
           cin>>num2>>str1>>str2;
            for(int j=1;j<=n/2;j++)
               if((a[j*2+1]==num1&&a[j*2]==num2)||(a[j*2]==num1&&a[j*2+1]==num2))
                {
                    flag=1;
                    break;
                }
              if(flag)
                printf("T\n");
              else
                printf("F\n");
       }
       else if(str[0]=='i')
       {
           cin>>str1>>str2;
           if(str2[0]=='r')
           {
               if(num1==a[1])
                printf("T\n");
               else
                printf("F\n");
           }
           else if(str2[0]=='p')
           {
               cin>>str4>>num2;
               for(int j=1;j<=n/2;j++)
                        if(a[j]==num1&&a[j*2]==num2||a[j]==num1&&a[j*2+1]==num2)
                           {
                               flag=1;
                               break;
                           }
               if(flag)
                  printf("T\n");
               else
                  printf("F\n");
           }
           else if(str2[0]=='c')
           {
               cin>>str4>>num2;
               for(int j=1;j<=n/2;j++)
                        if(a[j]==num2&&a[j*2]==num1||a[j]==num2&&a[j*2+1]==num1)
                           {
                               flag=1;
                               break;
                           }
               if(flag)
                  printf("T\n");
               else
                  printf("F\n");
           }
       }
   }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值