L2-012. 关于堆的判断
2018-03-16 17:01
274 查看
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 <algorithm> #include <cstring> #include <stdio.h> #include <vector> using namespace std; int h[40000]; int f[40000]; int sum=0; void push(int x){ h[++sum]=x; f[x]=sum; int cur=sum; while(cur!=1){ if(h[cur/2]>h[cur]){ swap(f[h[cur/2]],f[h[cur]]); swap(h[cur/2],h[cur]); cur/=2; } else break; } } int main(){ int n,m;scanf("%d%d",&n,&m); int y,x; for(int i=1;i<=n;i++){ scanf("%d",&x); x+=10005; push( x ); } while(m--){ scanf("%d",&x); x+=10005; char s[20]; scanf("%s",s); if(s[0]=='a'){ scanf("%d",&y); y+=10005; scanf("%s",s); scanf("%s",s); if(f[y]/2==f[x]/2) printf("T"); else printf("F"); } else { scanf("%s",s); if(s[0]=='a'){ scanf("%s",s); scanf("%s",s); scanf("%d",&y); y+=10005; if(f[x]/2==f[y]) printf("T"); else printf("F"); } else{ scanf("%s",s); if(s[0]=='r'){ if(f[x]==1) printf("T"); else printf("F"); } else{ scanf("%s",s); scanf("%d",&y); y+=10005; if(f[y]/2==f[x]) printf("T"); else printf("F"); } } } printf("\n"); } }
相关文章推荐
- PAT L2-012. 关于堆的判断【数据结构】
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断(小顶堆)
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断 (小顶堆)
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断 (最小堆)
- L2-012. 关于堆的判断【小顶堆模板】
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断-PAT团体程序设计天梯赛GPLT
- L2-012. 关于堆的判断
- L2-012. 关于堆的判断 (堆操作)