解题思路:
1、边输入边建小顶堆(下标从1开始)
2、判断
1)、根结点则下标为1
2)、若为兄弟结点,则两者双亲结点相同
3)、儿子结点下标/2=双亲结点下标(注意:用 ‘/‘ 不用 ’*‘)
#include <stdio.h> #include <string.h> #include <malloc.h> #define Max 1010 int arr[2]= {0}; int n,m; void Adjust(int a[],int k,int n) {//向下调整堆 a[0]=a[k]; int i; for(i=2*k; i<=n; i*=2) { if(i<n&&a[i]>a[i+1]) i++; if(a[0]<=a[i])break; else { a[k]=a[i]; k=i; } } a[k]=a[0]; } void BuildHeap(int a[],int n) {//建小顶堆 int i; for(i=n/2; i>0; i--) { Adjust(a,i,n); } } int find(int tmp,int a[]) {//获取下标 int i; for(i=1; i<=n; i++) { if(a[i]==tmp) { return i; } } return -1; } void Out(int tag,int a[]) {//判断命题 int i; int flag=0; if(tag==1) { if(find(arr[0],a)==1) flag=1; } else if(tag==2) { if(find(arr[0],a)/2==find(arr[1],a)/2) flag=1; } else if(tag==3) { if(find(arr[1],a)/2==find(arr[0],a)) flag=1; } else if(tag==4) { if(find(arr[1],a)==find(arr[0],a)/2) flag=1; } printf("%c ",flag?'T':'F'); } int main() { scanf("%d %d",&n,&m); int * a=(int *)malloc(sizeof(int)*Max); int i; for(i=1; i<=n; i++) { scanf("%d",&a[i]); BuildHeap(a,i); } char c[10],c1[10],c2[10]; int tag; for(i=0; i<m; i++) {//字符处理 scanf("%d %s",&arr[0],&c); if(!strcmp(c,"and")) { tag=2; scanf("%d %s%s",&arr[1],&c1,&c2); Out(tag,a); continue; } scanf("%s",&c); if(!strcmp(c,"a")) { tag=4; scanf("%s%s%d",&c1,&c2,&arr[1]); Out(tag,a); continue; } scanf("%s",&c); if(!strcmp(c,"parent")) { tag=3; scanf("%s%d",&c1,&arr[1]); Out(tag,a); continue; } if(!strcmp(c,"root")) { tag=1; Out(tag,a); continue; } } return 0; }