1147 Heaps (30分)
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int m,n;
bool isHeap(int u,int nums[],int len,int index){
if(u>=len) return true;
int left=isHeap(2*u,nums,len,index);
int right=isHeap(2*u+1,nums,len,index);
if(!left||!right) return false;
else if(2*u>=len) return true;
else if((2*u+1)>=len&&index==0&&u<=nums[2*u]||(2*u+1)>=len&&index==1&&u>=nums[2*u])
return true;
else if(index==0&&nums[u]<=nums[2*u]&&nums[u]<=nums[2*u+1]||index==1&&nums[u]>=nums[2*u]&&nums[u]>=nums[2*u+1])
return true;
return false;
}
bool tag=0;
void postOrder(int root,int nums[],int len){
if(root<len){
postOrder(2*root,nums,len);
postOrder(2*root+1,nums,len);
printf("%s%d",tag?" ":"",nums[root]);
tag=1;
}
}
int main()
{
scanf("%d%d",&m,&n);
int nums[n+1];
for(int i=0;i<m;i++){
for(int j=1;j<=n;j++){
scanf("%d",&nums[j]);
}
if(n==2&&nums[1]>=nums[2])
printf("Max Heap\n");
else if(n==2&&nums[1]<=nums[2])
printf("Min Heap\n");
else{
bool flag=0;int index=0;
if(nums[1]>=nums[2]&&nums[1]>=nums[3])
flag=1,index=1;
else if(nums[1]<=nums[2]&&nums[1]<=nums[3])
flag=1;
if(!flag)
printf("Not Heap\n");
else{
flag=isHeap(1,nums,n+1,index);
if(flag)
printf("%s\n",index?"Max Heap":"Min Heap");
else printf("Not Heap\n");
}
}
tag=0;
postOrder(1,nums,n+1);
printf("\n");
}
return 0;
}