题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805064676261888

题意大概就是在一个小顶堆里面判断下  根节点,父子关系,兄弟关系

不过我感觉天梯赛的题麻烦在一些输入输出,存储的形式上。

我这里是用的普通数组存储,利用heap类的函数进行堆排序。

再利用二叉树的性质进行条件的判断

代码a了一半测试点,剩下的硬是看不出哪里有问题,字符和数字的分割相当麻烦,用的暴力==(值得反思)


#include<bits/stdc++.h>
using namespace std;
string s;
int a[1100],n,m;
bool cmp(int a,int b)
{
	return a>b;
}
int find(int k)
{
	int i;
	for(i=1;i<=n+1;i++)
	{
		if(a[i]==k)
			return i;
	} 
	return 0;
}
void type1()
{
	int t = 0;
	int i=0;
	bool sign = true;
	if(s[i]=='-')
		sign=false,i++; 
	while(s[i]>='0'&&s[i]<='9'&&i<s.size())
	{
		t=t*10+(s[i]-'0');
		i++;
	}
	if(!sign)	t=-t;
	if(t == a[1])
		cout<<'T'<<endl;
	else 
		cout<<'F'<<endl;
}
void type2()
{
	int t1 = 0,t2 = 0;
	int i=0;
	bool sign=true,sign2=true;
	if(s[i]=='-')	
		sign=false,i++;
	while(s[i]>='0'&&s[i]<='9'&&i<s.size())
	{
		t1=t1*10+(s[i]-'0');
		i++;
	}
	if(!sign)	t1=-t1;
		while((s[i]<'0'||s[i]>'9')&&i<s.size())	i++;
	if(s[i-1]=='-')	sign2=false;
	while(s[i]>='0'&&s[i]<='9'&&i<s.size())
	{
		t2=t2*10+(s[i]-'0');
		i++;
	}
	if(!sign2)	t2=-t2;
//	cout<<t1<<' '<<t2<<endl;
	int ct1=find(t1);
	int ct2=find(t2);
	if(ct1/2==ct2/2)
		cout<<'T'<<endl;
	else
		cout<<'F'<<endl;
}
void type3()
{
	int t1 = 0,t2 = 0;
	int i=0;
    bool sign=true,sign2=true;
	if(s[i]=='-')	
		sign=false,i++;
	while(s[i]>='0'&&s[i]<='9'&&i<s.size())
	{
		t1=t1*10+(s[i]-'0');
		i++;
	}
	if(!sign)	t1=-t1;
		while((s[i]<'0'||s[i]>'9')&&i<s.size())	i++;
	if(s[i-1]=='-')	sign2=false;
	while(s[i]>='0'&&s[i]<='9'&&i<s.size())
	{
		t2=t2*10+(s[i]-'0');
		i++;
	}
	if(!sign2)	t2=-t2;
//	cout<<t1<<' '<<t2<<endl;
	int ct1 = find(t1);
	int ct2 = find(t2);
//	cout<<ct1<<' '<<ct2<<endl;
	if(ct1==ct2/2)
		cout<<'T'<<endl;
	else
		cout<<'F'<<endl;
}
void type4()
{
	int t1 = 0,t2 = 0;
	int i=0;
	bool sign=true,sign2=true;
	if(s[i]=='-')	
		sign=false,i++;
	while(s[i]>='0'&&s[i]<='9'&&i<s.size())
	{
		t1=t1*10+(s[i]-'0');
		i++;
	}
	if(!sign)	t1=-t1;
		while((s[i]<'0'||s[i]>'9')&&i<s.size())	i++;
	if(s[i-1]=='-')	sign2=false;
	while(s[i]>='0'&&s[i]<='9'&&i<s.size())
	{
		t2=t2*10+(s[i]-'0');
		i++;
	}
	if(!sign2)	t2=-t2;
//	cout<<t1<<' '<<t2<<endl;
	int ct1 = find(t1);
	int ct2 = find(t2);
	if(ct1/2==ct2)
		cout<<'T'<<endl;
	else
		cout<<'F'<<endl;
}
int main()
{
	int i,j;
	cin>>n>>m; 
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
	} 
	make_heap(a+1,a+n+1,cmp);//默认大顶堆,修改成小顶堆
/*	for(i=1;i<=n;i++)
	{
		cout<<a[i]<<' ';
	}
	cout<<endl;*/
	cin.sync();
	for(i=1;i<=m+1;i++)//天梯c++clang缓冲问题 
	{
		int typ=0;
		getline(cin,s);
		for(j=0;j<s.size();j++)
		{
			if(s[j]=='r'&&s[j+1]=='o'&&s[j+2]=='o'&&s[j+3]=='t')
				typ=1;
			else if(s[j]=='a'&&s[j+1]=='n'&&s[j+2]=='d')
				typ=2;
			else if(s[j]=='p'&&s[j+1]=='a'&&s[j+2]=='r'&&s[j+3]=='e'&&s[j+4]=='n'&&s[j+5]=='t')
				typ=3;
			else if(s[j]=='c'&&s[j+1]=='h'&&s[j+2]=='i'&&s[j+3]=='l'&&s[j+4]=='d')
				typ=4;
		}
		switch(typ)
		{
			case 1:type1();break;
			case 2:type2();break;
			case 3:type3();break;
			case 4:type4();break;
		}
        s.clear();
	}
} 


然后是大佬的代码:
https://www.cnblogs.com/caiyishuai/p/13271101.html           在测试服务器上编译不通过,但是很巧妙的利用sscanf进行分割值得好好学习一下。

还有这个大佬

https://blog.csdn.net/cyh1069247088/article/details/86719749       学不来┭┮﹏┭┮


欣赏一下该大佬全部ac的优美代码


#include <bits/stdc++.h> 
using namespace std;
bool is(int *a,int n)
{
	int A,B,count=0;
	char C;
	scanf("%d %c",&A,&C);
	if(C=='a')
	{
		count=2;
		scanf("nd %d are siblings",&B);
	}
	else
	{
		scanf("s %c",&C);
		if(C=='a')
		{
			count=4;
			scanf(" child of %d",&B);
		}
		else
		{
			scanf("he %c",&C);
			if(C=='r')
			{
				scanf("oot");
				count=1;
			}
			else
			{
				count=3;
				scanf("arent of %d",&B);
			}
		}
	}
	bool isOk=false;
	switch(count)
	{
		case 1:
			return A==a[0];
		case 2:
			for(int i=0;i<n;i++)
			{
				if(a[i]==A)
				{
					if(i%2==1&&i+1<n&&a[i+1]==B)	isOk=true;
					else if(i%2==0&&i-1>0&&a[i-1]==B)	isOk=true;
				}
			}
			return isOk;
		case 3:
			for(int i=0;i<n;i++)
			{
				if(a[i]==B)
				{
					if(i%2==0&&i/2-1>=0&&a[i/2-1]==A)	isOk=true;
					else if(i%2==1&&a[i/2]==A)	isOk=true;
				}
			}
			return isOk;
		case 4:
			for(int i=0;i<n;i++)
			{
				if(a[i]==A)
				{
					if(i%2==0&&i/2-1>=0&&a[i/2-1]==B)	isOk=true;
					else if(i%2==1&&a[i/2]==B)	isOk=true;
				}
			}
			return isOk;
	}
}
void AdjustDown(int *a,int i,int n)
{
	int j=2*i+1;
	while(j<n)
	{
		if(j+1<n&&a[j+1]<a[j])
			j++;
		if(a[i]<a[j])
			return;
		swap(a[i],a[j]);
		i=j;
		j=2*i+1;
	}
}
void AdjustHeap(int *a,int n)
{
	for(int i=n/2-1;i>=0;i--)
	{
		AdjustDown(a,i,n);
	}
}
int main()
{
	//freopen("in.txt","r",stdin);
	int n,m,a[1005]={0};
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		AdjustHeap(a,i+1);
	}
	
	while(m--)
	{
		if(is(a,n))
			printf("T\n");
		else
			printf("F\n");
	}
	return 0;
}