天梯赛L2-012

天梯赛L2-012

  • 将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:

    x is the root:x是根结点;
    x and y are siblings:x和y是兄弟结点;
    x is the parent of y:x是y的父结点;
    is a child of y:x是y的一个子结点。
    输入格式: 每组测试第1行包含2个正整数N(≤1000)和M(≤20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被插入一个初始为空的小顶堆的整数。之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。

    输出格式: 对输入的每个命题,如果其为真,则在一行中输出T,否则输出F。

模拟堆即可,注意输入可能为负数

#include<bits/stdc++.h>
using namespace std;
const int N=1e4;
int h[1005],n,m,p[20005];
void f(int x){
    
    
	while(x!=1)
		if(h[x]<h[x/2]){
    
    
			swap(h[x],h[x/2]);
			p[h[x]+N]=x;
			p[h[x/2]+N]=x/2;
			x>>=1;
		}
		else break; 
}
bool ch(string s){
    
    
	int x=0,y=0,i=0,j,len=s.size();
	bool flag=0;
	if(s[i]=='-') i++,flag=1;
	while(i<len){
    
    
		if(s[i]>='0'&&s[i]<='9')
			x*=10,x+=s[i]-'0';
		else break;
		i++;
	}
	if(flag) x*=-1,flag=0;
	if(s[i+1]=='a'){
    
    
		i+=5;
		if(s[i]=='-') i++,flag=1;
		while(i<len){
    
    
			if(s[i]>='0'&&s[i]<='9')
				y*=10,y+=s[i]-'0';
			else break;
			i++;
		}
		if(flag) y*=-1; 
		if(p[x+N]/2==p[y+N]/2) return 1;
		return 0;
	}
	if(s[len-1]=='t')
		if(p[x+N]==1) return 1;
		else return 0;
	j=i,i=len;
	while(s[i-1]<='9'&&s[i-1]>='0') i--;
	if(s[i-1]=='-') flag=1;
	while(i<len){
    
    
		if(s[i]>='0'&&s[i]<='9')
			y*=10,y+=s[i]-'0';
		else break;
		i++;
	}
	if(flag) y*=-1;
	if(s[j+4]=='a')
		if(p[x+N]/2==p[y+N]) return 1;
		else return 0;
	else 
		if(p[x+N]==p[y+N]/2) return 1;
		else return 0;
}
int main(){
    
    
	cin>>n>>m;
	string s;
	for(int i=1;i<=n;i++){
    
    
		cin>>h[i];
		p[h[i]+N]=i;
		f(i);
	}
	getline(cin,s);
	for(int i=1;i<=m;i++){
    
    
		getline(cin,s);
		if(ch(s)) cout<<"T"<<endl;
		else cout<<"F"<<endl;
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/u013455437/article/details/109413199