L2-012 关于堆的判断

手动建立小根堆。
注意每次输入之前都要把之前缓冲区的内容清理掉getline(),以免影响下一次读取。

#include <bits/stdc++.h>
using namespace std;
int a[1010],n,m;
map<int,int> mp;
int main() {
	cin>>n>>m;
	for(int i=0; i<n; i++) {
		cin>>a[i];
		mp[a[i]]=i;
	}
	for(int i=0; i<n; i++) {
		//和父亲进行比较、
		int j=i;
		int parent=(j-1)/2;
		while(parent>=0&&a[j]<a[parent]) {
			//交换位置
			swap(a[parent],a[j]);//元素交换 
			swap(mp[a[j]],mp[a[parent]]);//元素位置交换  
			j=parent;
			parent=(j-1)/2;
		}
	}
	//打印测试
	for(int i=0; i<m; i++) {
		int a,b;
		string s;
        getline(cin,s);
		cin>>a>>s;
		if(s[0]=='a'){
			cin>>b;
            if((mp[a]-1)/2==(mp[b]-1)/2){
            	cout<<"T"<<'\n';
			}else{
				cout<<"F"<<'\n';
			}
		} else{
			cin>>s>>s;
			if(s=="root"){
				cout<<(mp[a]==0?"T":"F")<<'\n';
			}else if(s=="parent"){
				cin>>s>>b;
				cout<<(mp[a]==(mp[b]-1)/2?"T":"F")<<'\n';
			}else{
				cin>>s>>b;
				cout<<((mp[a]-1)/2==mp[b]?"T":"F")<<'\n';
			}
		}
	}
	return 0;
}
posted @ 2024-03-15 17:29  YuKiCheng  阅读(38)  评论(0编辑  收藏  举报