?题目详情 - L2-012 关于堆的判断 (25 分) (pintia.cn)
题解:
将数据结构和代码结合,不光是学PPT,更要会自己把代码敲出来,虽然DS考的还行,但是高分低能可不行,这个题就是教会我如何写出来小根堆!并且运用性质(i和i*2+1)放在数组中。
ACCODE:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1010];
char c[1010];
void creat(int x){
if(x==1)return ;
else {
while(x!=1){
if(a[x]<a[x/2])swap(a[x],a[x/2]);
else break;
x/=2;
}
}
}
bool isbro(int x,int y){
int ix,iy;
for(int i=1;i<=n;i++){
if(a[i]==x)ix=i;
if(a[i]==y)iy=i;
}
if(ix>iy)swap(ix,iy);
if(ix%2==0&&iy-ix==1)return 1;
return 0;
}
bool isson(int x,int y){
int ix,iy;
for(int i=1;i<=n;i++){
if(a[i]==x)ix=i;
if(a[i]==y)iy=i;
}
if(ix/2==iy)return 1;
return 0;
}
bool isparent(int x,int y){
int ix,iy;
for(int i=1;i<=n;i++){
if(a[i]==x)ix=i;
if(a[i]==y)iy=i;
}
if(iy/2==ix)return 1;
return 0;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
creat(i);
}
int x,y;
for(int i=1;i<=m;i++){
cin>>x>>c;
if(c[0]=='a'){
cin>>y>>c>>c;
if(isbro(x,y))cout<<'T'<<endl;
else cout<<'F'<<endl;
}else {
cin>>c;
if(c[0]=='a'){
cin>>c>>c>>y;
if(isson(x,y))cout<<'T'<<endl;
else cout<<'F'<<endl;
}
else{
cin>>c;
if(c[0]=='r'){
if(a[1]==x)cout<<'T'<<endl;
else cout<<'F'<<endl;
}
else{
cin>>c>>y;
if(isparent(x,y))cout<<'T'<<endl;
else cout<<'F'<<endl;
}
}
}
}
}
|