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