看别人的题解 看了好久 就是不懂小顶堆是什么意思 朋友两句话就解决了
看成一个完全二叉树 如果子节点大于父节点 那么就交换数值
zz 竟然就这么的简单 我看别人题解看了好久 还是一脸懵逼
最后的输出没有标记 就直接输出了 看着麻烦 写起来简单
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<vector> #include<map> #include<math.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 10700 int a[N]; void q(int x) { if(x==1) return ; if(a[x]<a[x/2]) { swap(a[x],a[x/2]); q(x/2); } return ; } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d ",&a[i]); q(i); } while(m--) { char str[120]; gets(str); int len=strlen(str); int ans=0,d=0,dd=0,w=0,falg=0; for(int i=0;i<len;i++) { if(w&&str[i]>='0'&&str[i]<='9') d=d*10+str[i]-'0'; if(!w&&str[i]>='0'&&str[i]<='9') dd=dd*10+str[i]-'0'; if(str[i]==' '||str[i]=='c') { ans++; w=1; } if(str[i]=='-'&&i>1&&str[i-1]==' ') falg=1; } if(str[0]=='-') dd=-dd; if(falg==1) d=-d; int e,f; if(ans==3) { if(a[1]!=dd) printf("F "); else printf("T "); } else if(ans==4) { for(int i=1;i<=n;i++) { if(a[i]==d) e=i; if(a[i]==dd) f=i; } if(abs(f-e)==1&&e/2==f/2) printf("T "); else printf("F "); } else if(ans==5) { for(int i=1;i<=n;i++) { if(a[i]==d) e=i; } if(a[e/2]==dd) printf("T "); else printf("F "); } else { for(int i=1;i<=n;i++) { if(a[i]==dd) e=i; } if(a[e/2]==d) printf("T "); else printf("F "); } } return 0; }