L2-012. 關於堆的判斷【小頂堆模板】
阿新 • • 發佈:2019-02-01
小頂堆建初堆:
void build(int v)
{
if(v*2==inf) return;
int minn=inf,tmp;
if(H[v*2]<minn) minn=H[tmp=v*2];
if(H[v*2+1]<minn) minn=H[tmp=v*2+1];//找到值最小的孩子節點
if(minn<H[v])//如果最小的孩子節點比當前節點小
{
swap(H[v],H[tmp]);//交換
build(tmp);//調整子樹
}
}
for(int i=1;i<=n;i++) scanf("%d",&H[i]); for(int i=n;i>=1;i--) build(i);
程式碼:
#include <iostream> #include<stdio.h> #include<string.h> #include<queue> #include<map> #include<vector> #include<algorithm> using namespace std; #define inf 1<<29 int n,m,H[4005]; int t[20005]; void build(int v) { if(v*2==inf) return; int minn=inf,tmp; if(H[v*2]<minn) minn=H[tmp=v*2]; if(H[v*2+1]<minn) minn=H[tmp=v*2+1];//找到值最小的孩子節點 if(minn<H[v])//如果最小的孩子節點比當前節點小 { swap(H[v],H[tmp]);//交換 build(tmp);//調整子樹 } } int main() { scanf("%d%d",&n,&m); for(int i=1; i<=4000; i++) H[i]=inf; for(int i=1; i<=n; i++) { scanf("%d",&H[i]); for(int j=i-1;j>=1;j--) build(j); } memset(t,-1,sizeof t); for(int i=1;i<=n;i++) t[H[i]+10000]=i; while(m--) { int u,v; char str[10]; scanf("%d%s",&u,str); u+=10000; if(str[0]=='a') { scanf("%d%s%s",&v,str,str); v+=10000; if(t[u]==-1 || t[v]==-1) printf("F\n"); else if(t[v]%2 && t[u]+1==t[v]) printf("T\n"); else if(t[u]%2 && t[v]+1==t[u]) printf("T\n"); else printf("F\n"); } else { scanf("%s",str); if(str[0]=='a') { scanf("%s%s%d",str,str,&v); v+=10000; if(t[v]==-1 || t[u]==-1) printf("F\n"); else if(t[u]/2==t[v]) printf("T\n"); else printf("F\n"); } else { scanf("%s",str); if(str[0]=='r') { if(t[u]==-1) printf("F\n"); else if(t[u]==1) printf("T\n"); else printf("F\n"); } else { scanf("%s%d",str,&v); v+=10000; if(t[u]==-1 || t[v]==-1) printf("F\n"); else if(t[v]/2==t[u]) printf("T\n"); else printf("F\n"); } } } } return 0; }