将一系列给定数字顺序插入一个初始为空的小顶堆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

分析:

所谓小顶堆就是要求对于树中的每一个根节点来说,即小于他的左子树又小于他的右子树。

我们首先要将输入的序列构造成一个小顶堆,在这个构造的过程中应该注意的一点就是不能够在把树构造完成之后再进行调整,而是应该每当插入一个节点的时候就将树的结构调整好,这里应该注意调整的方法,因为如果你调整的方法不一样的话所构造出来的小顶堆的形式也是不一样的,这样对我们后期数据的判断会有很大的影响。

如果是树的形态构造好之后再进行调整的话,我们应该明确一点就是对于叶子节点来书是不需要进行调整的,所以开始调整的点的下标就应该是n=N/2。

void Tiao(int n)
{
int temp;
for(int i=n;i>0;i--)//从第一个节点开始往前调整
{
int t=i,op=0;
while( i*2<=N&&op==0)//有左孩子,并且这个节点没有达到平衡状态
{
if(i*2<=N)
if(a[i]>a[i*2])//有左节点且根节点小于左节点
{
t=2*i;
}
if(i*2+1<=N)
if(a[t]>a[i*2+1])//有右节点,且右节点小于左节点和根节点中的较小值
{
t=2*i+1;
}
if(t!=i)//相当于当前的树形式需要进行调整
{
temp=a[i];
a[i]=a[t];
a[t]=temp;
i=t;
}
else//不用调整的话,就不用再往下了,
op=1;
}
}
}

但是这种调整的方法并不适合我们的题目,题目要求我们每次插入一个节点之后就要进行调整

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int N,M;
int a[10000];
void just(int n)
{
int i=n;
int temp;
if(i==1)//第一个相当于整个树的根节点,是不用进行调整的
return;
else
{
while(i!=1)//插入的当前结点要与他的根结点进行比较
{
if(a[i]<a[i/2])
{
temp=a[i];
a[i]=a[i/2];
a[i/2]=temp;
i=i/2;
}
else
break;
}
}
}
int main()
{
scanf("%d%d",&N,&M);
for(int i=1; i<=N; i++)
{
scanf("%d",&a[i]);//每次加入一个节点都要进行调整
just(i);
}
getchar();
for(int kk=1; kk<=M; kk++)
{
char s[1000];
string ss;
gets(s);
ss=s;
int op;
op=ss.find("root");//find()方法是string类型下的方法 ,返回的是找到的第一个字符的下标
if(op!=-1)//相当于找到了
{
int mm;
sscanf(s,"%d",&mm);//输入流,把s的第一个整形数据给mm
if(a[1]==mm)//为根节点
printf("T\n");
else
printf("F\n");
}
else//没有找到
{
op=ss.find("siblings");
if(op!=-1)
{
int mm,nn,n,m;
char ch1[10];
sscanf(s,"%d %s %d",&nn,ch1,&mm);
for(int i=1; i<=N; i++)
{
if(a[i]==nn)
n=i;
if(a[i]==mm)
m=i;
}
if(n/2==m/2)
printf("T\n");
else
printf("F\n");
}
else
{
op=ss.find("parent");
if(op!=-1)
{
int mm,nn,m,n;
char ch1[10];
char ch2[10];
char ch3[10];
char ch4[10];
sscanf(s,"%d %s %s %s %s %d",&nn,ch1,ch2,ch3,ch4,&mm);
for(int i=1; i<=N; i++)
{
if(a[i]==nn)
n=i;
if(a[i]==mm)
m=i;
}
if(n==m/2)
printf("T\n");
else
printf("F\n");
}
else
{
op=ss.find("child");
if(op!=-1)
{
int mm,nn,n,m;
char ch1[10];
char ch2[10];
char ch3[10];
char ch4[10];
sscanf(s,"%d %s %s %s %s %d",&nn,ch1,ch2,ch3,ch4,&mm);
//这里虽然中间的字符串没有用到,也要获取出来,不然没法取到最后一个整形数据
for(int i=1; i<=N; i++)
{
if(a[i]==nn)
n=i;
if(a[i]==mm)
m=i;
}
if( n/2==m)
printf("T\n");
else
printf("F\n");
}
}
}
}
}
return 0;
}

天梯赛 L2-012 关于堆的判断 (二叉树)的更多相关文章

  1. PTA天梯赛L2

    L2-001 紧急救援 题意:就是给你一张n<500的图:让你求最短路径,最短路条数,以及路径: 做法,先用dijkstra求最短路,然后dfs找最短路条数,以及点权的最大值: 一般dfs不就可 ...

  2. pat 团体天梯赛 L2-012. 关于堆的判断

    L2-012. 关于堆的判断 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的小顶堆H[] ...

  3. PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

    PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...

  4. L1-049 天梯赛座位分配​​​​​​​

    L1-049 天梯赛座位分配 (20 分) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i ...

  5. 第四届CCCC团体程序设计天梯赛 后记

    一不小心又翻车了,第二次痛失200分 1.开局7分钟A了L2-3,一看榜已经有七个大兄弟排在前面了,翻车 * 1 2.把L1-3 A了18分,留了两分准备抢顽强拼搏奖,最后五秒钟把题过了,万万没想到还 ...

  6. 团体程序设计天梯赛(CCCC) L3009 长城 方法证明

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code

  7. L1-049. 天梯赛座位分配

    天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位 ...

  8. 天梯赛2016-L2

    L2-001. 紧急救援 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在 ...

  9. 『ACM C++』 PTA 天梯赛练习集L1 | 052-053

    今日刷题,水题水题 ------------------------------------------------L1-052------------------------------------ ...

  10. PTA L2-023 图着色问题-前向星建图 团体程序设计天梯赛-练习集

    L2-023 图着色问题 (25 分)   图着色问题是一个著名的NP完全问题.给定无向图,,问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解 ...

随机推荐

  1. 【Leetcode】50. Pow(x, n)

    Implement pow(x, n). Example 1: Input: 2.00000, 10 Output: 1024.00000 Example 2: Input: 2.10000, 3 O ...

  2. url传带有汉字的参数乱码解决

    url传带有汉字的参数乱码解决 var reg = new RegExp("(^|&)createName=([^&]*)(&|$)"); var r = ...

  3. win7 64位机ODBC的数据源DSN添加和移除问题

    64位机器上ODBC的操作方法与32位机器是不一样的,如果直接从控制面板上-管理员工具-ODBC进去的话会发现User DSN以及System DSN里面都为空,ADD的时候连ODBC Driver都 ...

  4. 守护线程以及要使用时注意的一点(Daemon Thread)

    在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) Daemon的作用是为其他线程的运行提供便利服务,比如垃圾回收线程就是一个很称职的守护者.User和 ...

  5. 第199天:js---扩充内置对象功能总结

    一.数组 1.删除数组中指定索引的数据 /** 删除数组中指定索引的数据 **/ Array.prototype.deleteAt = function (index) { if (index < ...

  6. Struts按着配置文件的加载的顺序,后面文件和前面文件相同的配置,后面的会把前面的文件的值覆盖

    Struts按着配置文件的加载的顺序,后面文件和前面文件相同的配置,后面的会把前面的文件的值覆盖

  7. CF487E-Tourists

    题意 给出一个\(n\)个点\(m\)条边的无向图,给出每个点的初始点权,\(q\)次操作: 修改一个点的点权 询问两点间的所有路径中最小点权最小的路径上的最小点权 \(n,m,q\le 10^5,w ...

  8. 【入门向】使用 MetaHook Plus 绘制 HUD

    MetaHook Plus 是一个GoldSrc引擎(就是的Half-Life.CS1.6的引擎)的客户端插件平台,它可以加载我们自己开发的DLL插件. 首先你需要安装一个 Visual Studio ...

  9. 【BZOJ4651】【NOI2016】网格(Tarjan,哈希)

    [BZOJ4651][NOI2016]网格(Tarjan,哈希) 题面 BZOJ 洛谷 题解 首先把题目稍微变得好说一些,给定一个网格,已经删去了若干个格子 问最少删去多少个格子使得图不连通. 这题的 ...

  10. LCA的倍增算法

    LCA,即树上两点之间的公共祖先,求这样一个公共祖先有很多种方法: 暴力向上:O(n) 每次将深度大的点往上移动,直至二者相遇 树剖:O(logn) 在O(2n)预处理重链之后,每次就将深度大的沿重链 ...