L2-012. 关于堆的判断
Posted 我是codel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了L2-012. 关于堆的判断相关的知识,希望对你有一定的参考价值。
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
分析:这里是小顶堆(还有大顶堆),小顶堆的特点就是:父节点的值一定小于子节点的值。
堆有几个基本操作,添加和删除(删除默认删除最小元素)
基本代码如下
//插入操作
1 int sz=0; 2 //sz设置为一个全局变量,用来表示当前要插入的位置 3 void push(int x){ 4 int i=sz++; 5 while(i>0){ 6 int p=(i-1)/2; //找到要插入位置的父节点位置 7 if(a[p]<=x) break; 8 a[i]=a[p]; 9 i=p; //移动要插入的下标 10 } 11 a[i]=x; 12 }
ac代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[10000]; 4 int n, m, sz=0; 5 void push(int x){ 6 int i=sz++; 7 while(i>0){ 8 int p=(i-1)/2; 9 if(a[p]<=x) break; 10 a[i]=a[p]; 11 i=p; 12 } 13 a[i]=x; 14 } 15 int main(){ 16 cin>>n>>m; 17 for(int i=0; i<n; i++){ 18 int x; 19 cin>>x; 20 push(x); 21 } 22 for(int cnt=0; cnt<m; cnt++){ 23 //cout<<cnt<<" "<<m<<endl; 24 int x, y; 25 string ch, c_a, c_b, c_c; 26 cin>>x; 27 //cout<<x<<" "; 28 cin>>ch; 29 //cout<<ch<<" "; 30 if(ch[0]==‘a‘){ 31 cin>>y; 32 for(int j=0; j<n; j++){ 33 if(a[j]==x){ 34 if(j==0){ 35 cout<<"F"<<endl; 36 break; 37 } 38 if(a[(j-1)/2*2+1]==y||a[(j-1)/2*2+2]==y) cout<<"T"<<endl; 39 else cout<<"F"<<endl; 40 } 41 } 42 cin>>c_a>>c_b; 43 }else{ 44 string c; 45 cin>>c; 46 if(c[0]==‘a‘){ 47 cin>>c_a>>c_b; 48 cin>>y; 49 for(int j=0; j<n; j++){ 50 if(a[j]==y){ 51 if(a[j*2+1]==x||a[j*2+2]==x) cout<<"T"<<endl; 52 else cout<<"F"<<endl; 53 break; 54 } 55 } 56 }else{ 57 string p; 58 cin>>p; 59 if(p[0]==‘r‘){ 60 if(a[0]==x) cout<<"T"<<endl; 61 else cout<<"F"<<endl; 62 }else{ 63 int z; 64 cin>>c_a; 65 cin>>z; 66 for(int j=0; j<n; j++){ 67 if(a[j]==x){ 68 if(a[j*2+1]==z||a[j*2+2]==z) cout<<"T"<<endl; 69 else cout<<"F"<<endl; 70 break; 71 } 72 } 73 } 74 } 75 } 76 } 77 return 0; 78 }
以上是关于L2-012. 关于堆的判断的主要内容,如果未能解决你的问题,请参考以下文章