这里的第二序列相当于是排序还没拍好的序列
对于第二个样例的第二个序列其实已经是大顶堆了 然后才进行的堆排序 知道这个就好做了
#include<bits/stdc++.h> using namespace std; vector<int>a,b; int n; void downAdjust(int low,int high) { int i=low; int j=i*2; while(j<=high){ if(j+1<=high&&b[j]<b[j+1]){ j=j+1; } if(b[j]>b[i]){ swap(b[j],b[i]); i=j; j=i*2; } else break; } } int main() { scanf("%d",&n); a.resize(n+1); b.resize(n+1); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); int flag=2; while(flag<=n&&b[flag]>=b[flag-1]) flag++; int index=flag; while(flag<=n&&a[flag]==b[flag]) flag++; if(flag==n+1){ printf("Insertion Sort "); sort(b.begin()+1,b.begin()+1+index); for(int i=1;i<=n;i++){ if(i!=1) printf(" "); printf("%d",b[i]); } } else{ printf("Heap Sort "); int f=n; while(f>1&&b[f-1]<=b[f]){ f--; } swap(b[1],b[f]); downAdjust(1,f-1); for(int i=1;i<=n;i++){ if(i!=1) printf(" "); printf("%d",b[i]); } } return 0; }