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; }