【PTA】【L2-012】关于堆的判断 (25 分)

【PTA】【L2-012】关于堆的判断 (25 分)
用数组模拟建堆,为了达到判断结点关系的目的需要用map进行映射。
输入样例:

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<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3 + 5;
int a[N],n,m;
map<int,int>mp;

//建堆
void insert(int x,int p)
{
	a[p] = x;
	while(p!=1){
		if(a[p]<a[p>>1]){
			swap(a[p],a[p>>1]);
			p>>=1;
		}
		else break;
	}
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int t;
		cin>>t;
		insert(t,i);
	}
	for(int i=1;i<=n;i++) mp[a[i]]=i;//建立映射关系
	for(int i=1;i<=m;i++){
		bool flag = 0;
		int p,q;
		string s;
		cin>>p>>s;
		if(s=="and"){
			cin>>q>>s>>s;
			if(a[mp[p]^1]==q) flag = 1;
		}
		else{//s=="is"
			cin>>s;
			if(s=="a"){
				cin>>s>>s>>q;
				if(mp[p]/2==mp[q]) flag = 1;
			} else {//s=="the"
				cin>>s;
				if(s=="root"){
					if(a[1]==p) flag = 1;
				} else {//s=="parent" 
					cin>>s>>q;
					if(mp[q]/2==mp[p]) flag = 1;
				}
			}
		}
		if(flag) 
			cout<<"T\n";
		else 
			cout<<"F\n";
	}
	return 0;
}
上一篇:题223.2022寒假天梯赛训练-7-12 清点代码库 (25 分)


下一篇:PAT 1048 Find Coins (25 分) map or Hash散列