PAT12-012【建最小堆】

卧槽。。没看清 值 还有负的。。

PS: 注意他说是一个一个插入的,也就是插在完全二叉树的最末位置,然后向上更新。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

int a[1010];

void BuildMinHeap(int n)
{
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		int j=i;
		while(a[j]<a[j/2]&&j>1)
		{
			swap(a[j],a[j/2]);
			j/=2;
		}
	}
}

int main()
{
	int x,y,len,k,n;
	char s[110];
	scanf("%d%d",&n,&k);
	BuildMinHeap(n);
	
	while(k--)
	{
		int flag,ff=0;
		scanf("%d",&x);
		gets(s);
		len=strlen(s);
		y=0;
		for(int i=0;i<len;i++)
		{
			if(s[i]=='-') ff=1;
			if(i+1<len&&s[i]=='r'&&s[i+1]=='o') flag=1;
			if(i+1<len&&s[i]=='s'&&s[i+1]=='i') flag=2;
			if(i+1<len&&s[i]=='p'&&s[i+1]=='a') flag=3;
			if(i+1<len&&s[i]=='c'&&s[i+1]=='h') flag=4;
			if(s[i]>='0'&&s[i]<='9') y=y*10+s[i]-'0';
		}
		if(ff) y=-y;
		if(flag==1)
		{
			if(x==a[1]) puts("T");
			else puts("F");
		}
		else if(flag==2)
		{
			bool f=false;
			for(int i=1;(2*i+1)<=n;i++)
				if((a[2*i]==x&&a[2*i+1]==y)||(a[2*i]==y&&a[2*i+1]==x)) 
					{puts("T");f=true;break;}
			if(!f) puts("F");
		}
		else if(flag==3)
		{
			bool f=false;
			for(int i=1;i<=n;i++)
			{
				if(a[i]==x)
					if(2*i<=n&&a[2*i]==y){puts("T");f=true;break;}
				if(a[i]==x)
					if((2*i+1)<=n&&a[2*i+1]==y){puts("T");f=true;break;}
			}
			if(!f) puts("F");
		}
		else if(flag==4)
		{
			bool f=false;
			for(int i=1;i<=n;i++)
			{
				if(a[i]==y)
					if(2*i<=n&&a[2*i]==x){puts("T");f=true;break;}
				if(a[i]==y)
					if((2*i+1)<=n&&a[2*i+1]==x){puts("T");f=true;break;}
			}
			if(!f) puts("F");		
		}
	}
	return 0;
}


posted @ 2017-03-13 00:44  see_you_later  阅读(176)  评论(0编辑  收藏  举报