团体程序设计天梯赛-练习集 -- L2-012. 关于堆的判断(最小堆)
2017-03-24 22:12
447 查看
题意:
给你n 个数,插入到堆中,给你m 个四种命令,问你是否正确。
思路:
手写堆push 函数,先建立好堆,因为每个数都是独一无二的,直接统计每个数在堆中的位置,模拟询问即可。
就是询问的读入有些麻烦,多写几个if else 特判就好了
时间限制
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”。
输入样例:
输出样例:
提交代码
给你n 个数,插入到堆中,给你m 个四种命令,问你是否正确。
思路:
手写堆push 函数,先建立好堆,因为每个数都是独一无二的,直接统计每个数在堆中的位置,模拟询问即可。
就是询问的读入有些麻烦,多写几个if else 特判就好了
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,q; int heap[1007]; int sz = 0; int pos[20000 + 10]; void push(int x){ int i = ++sz; while(i > 1){ int p = i>>1; if (heap[p] <= x) break; heap[i] = heap[p]; i = p; } heap[i] = x; } void dfs(int c){ if (c > sz) return; pos[heap[c]+ 10000 ] = c; dfs(c<<1); dfs(c<<1|1); } char cmd[20]; int main(){ scanf("%d %d",&n, &q); for (int i = 1; i <= n; ++i) { int x; scanf("%d",&x); push(x); } dfs(1); while(q--){ int x; scanf("%d",&x); scanf("%s",cmd); if (cmd[0] == 'i'){ scanf("%s",cmd); if (cmd[0] == 't'){ scanf("%s",cmd); if (cmd[0] == 'r'){ if (x == heap[1]) puts("T"); else puts("F"); } else { scanf("%s",cmd); int y; scanf("%d",&y); int p = pos[y+10000]; if (p == 1 || heap[p/2 ] != x ) puts("F"); else puts("T"); } } else { for (int i = 0; i < 2; ++i)scanf("%s",cmd); int y; scanf("%d",&y); int py = pos[y+10000]; int px = pos[x+10000]; if (px /2 == py) puts("T"); else puts("F"); } } else { int y; scanf("%d",&y); for (int i = 0; i< 2; ++i)scanf("%s",cmd); int p1 = pos[x+10000], p2 = pos[y+10000]; if (p1 == 1 || p2 == 1) puts("F"); else { if (p1 & 1) swap(p1,p2); if (p1+ 1 != p2) puts("F"); else puts("T"); } } } return 0; }
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
提交代码
相关文章推荐
- 团体程序设计天梯赛-练习集 L2-012. 关于堆的判断 解题报告
- 团体程序设计天梯赛-练习集 L2-012 关于堆的判断
- 团体程序设计天梯赛-练习集 L2-012. 关于堆的判断
- 团体程序设计天梯赛L2-012 关于堆的判断
- L2-012. 关于堆的判断-PAT团体程序设计天梯赛GPLT
- 团体程序设计天梯赛-练习集 L2-011. 玩转二叉树
- 团体程序设计天梯赛-练习集L2-002. 链表去重
- 团体程序设计天梯赛-练习集 PAT L2-001 紧急救援
- 团体程序设计天梯赛-练习集 L2-2. 链表去重 数组模拟链表
- 团体程序设计天梯赛-练习集 L2-001 紧急救援 dijkstra 解题报告
- 团体程序设计天梯赛-练习集 L2-1. 紧急救援 Dijstra单源最短路径拓展应用
- 团体程序设计天梯赛-练习集L2-003. 月饼
- 团体程序设计天梯赛-练习集 L2-008. 最长对称子串
- 团体程序设计天梯赛-练习集 L2-009. 抢红包
- PAT 团体程序设计天梯赛-练习集 L2-001. 紧急救援 【dijkstra】
- 团体程序设计天梯赛-练习集 L2-006 树的遍历 根据后序中序建树+BFS
- 团体程序设计天梯赛-练习集 L2-4. 这是二叉搜索树吗? 区间递归
- 团体程序设计天梯赛-练习集 L2-006. 树的遍历
- 团体程序设计天梯赛-练习集 L2-005
- 团体程序设计天梯赛-练习集 L2-005 集合相似度 STL set集合的交和并