L2-012. 关于堆的判断 (堆操作)
来源:互联网 发布:怎么修改数据库时间 编辑:程序博客网 时间:2024/04/28 19:42
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
边输入边建堆
注意负号
可以利用一个pos数组来存数的位置
见代码
#include <bits/stdc++.h>using namespace std;const int minx = -100010; ///初始化最小值int h[1100]; ///小顶堆int pos[20010]; ///记录每个值的位置 原来数据+10000 因为范围是-10000~10000int sz = 0;void in(int x){ int i; sz++; for(i=sz; h[i/2]>=x && i > 1; i/=2) ///小顶堆 { h[i] = h[i/2]; pos[h[i/2]+10000] = i; ///更新pos } h[i] = x; pos[x+10000] = i; ///记录pos}char s[111];int main(){ int n,m,x; int i,j,len; int y,sum,t; int flag = 0; while(~scanf("%d%d",&n,&m)) { sz = 0; for(i=1; i<=n; i++) h[i] = minx; ///初始化堆 for(i=1; i<=n; i++) { scanf("%d",&x); in(x); ///建立小顶堆 } getchar(); for(i=1; i<=m; i++) { gets(s); ///以后死活不用std::ios::....cin.getline原型是gets? len = strlen(s); flag = 0; ///负数判定 if(s[len-1] == 't') ///判断是不是根 不同的数s长度会改变! { x = 0; for(j=0; s[j]!=' '; j++) { if(s[j] == '-') { flag = 1; continue; } x=x*10+s[j]-'0'; } if(flag) x = -x; flag = 0; if(x==h[1]) printf("T\n"); ///判断根 else printf("F\n"); } else if(s[len-1] == 's') { x = y = 0; for(j=0; s[j]!=' '; j++) { if(s[j] == '-') ///判断负号 不要忘了!!! { flag = 1; continue; } x=x*10+s[j]-'0'; } if(flag) x = -x; flag = 0; j++; while(s[j]!=' ') { j++; } for(j=j+1; s[j]!=' '; j++) { if(s[j] == '-') { flag = 1; continue; } y=y*10+s[j]-'0'; } if(flag) y = -y; flag = 0; int xid = pos[x+10000]; ///+10000找位置 int yid = pos[y+10000]; if(xid/2 == yid/2) ///兄弟 同父 { printf("T\n"); } else printf("F\n"); } else { sum = 0; for(j=0; s[j]; j++) { if(s[j] == ' ') sum++; if(sum == 2) ///判断第二个空格后的字母 t/a { if(s[j+1] == 't') { x=y=t=0; for(j=0; s[j]!=' '; j++) { if(s[j] == '-') { flag = 1; continue; } x=x*10+s[j]-'0'; } if(flag) x=-x; flag = 0; for(j=len-1; s[j]!=' '; j--) { if(s[j] == '-') { flag = 1; continue; } y=y+(s[j]-'0')*pow(10,t); t++; } if(flag) y=-y; flag = 0; int xid = pos[x+10000]; int yid = pos[y+10000]; if(xid == yid/2) ///父子 { printf("T\n"); } else printf("F\n"); } else { x=y=t=0; for(j=0; s[j]!=' '; j++) { if(s[j] == '-') { flag = 1; continue; } x=x*10+s[j]-'0'; } if(flag) x=-x; flag = 0; for(j=len-1; s[j]!=' '; j--) ///逆序模拟 用到了pow(10,t) { if(s[j] == '-') { flag = 1; continue; } y=y+(s[j]-'0')*pow(10,t); t++; } if(flag) y=-y; flag = 0; int xid = pos[x+10000]; int yid = pos[y+10000]; if(xid/2 == yid) ///子父 { printf("T\n"); } else printf("F\n"); } break; } } } } } return 0;}
1 0
- L2-012. 关于堆的判断 (堆操作)
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- PAT L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- PAT L2-012. 关于堆的判断(最小堆调整)
- PAT L2-012. 关于堆的判断(堆)
- GPLT L2-012. 关于堆的判断【建堆】
- L2-012 关于堆的判断
- PAT L2-012. 关于堆的判断【数据结构】
- 天梯赛 L2-012. 关于堆的判断 数据结构
- 很特别的一个动态规划入门教程
- qt的QTabelWidget控件单元格读取错误的解决方法
- 百度面经+笔经(转自fengsanshao)
- 构造代码块、局部代码块
- 傅里叶变换的由来及复数下的傅里叶变换公式证明
- L2-012. 关于堆的判断 (堆操作)
- Archlinux+VMWare
- 1_数据结构简介
- 优化篇-“移动端”图片上传架构的变迁
- windows下将mysql加入环境变量
- 【SysML】模块定义图(BDD, Block Definition Diagram)
- 内网穿透端口映射工具
- Android 侧滑菜单的实现(NavigationView)
- BIOS作用及笔记