1 条题解

  • 0
    @ 2017-09-27 19:47:08
    #include<cstdio>
    #include<algorithm>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int n,d[100001]; 
    void swp(int &a1,int &a2,int &a3)
    {
        if(a1>a2) swap(a1,a2);
        if(a1>a3) swap(a1,a3);
        if(a2>a3) swap(a2,a3); 
    }
    int search(int pos,int key)
    {
        int d1=d[pos<<1],d2=d[pos<<1|1],d3=key;
        swp(d1,d2,d3);
        if(d1==key)
        return pos;
        else if(d[pos<<1]==d1)
        return search(pos<<1,d1);
        else if(d[pos<<1|1]==d1)
        return search(pos<<1|1,d1);
    }
    int main()
    {
        freopen("a.in","r",stdin);
        freopen("a.out","w",stdout);
        scanf("%d",&n);
        //memset(d,127,sizeof(d));
        for(int i=1;i<=n;i++)
        scanf("%d",&d[i]);
        for(int i=1;i<=n;i++)
        {
            if(i*2==n)
            {
                int a1=d[i],a2=d[i<<1];
                d[i]=min(a1,a2),d[i<<1]=max(a1,a2);
                break;
            }
            int a1=d[i],a2=d[i<<1],a3=d[i<<1|1];
            swp(a1,a2,a3);
            if(d[i]==a1)
            continue;
            if(d[i<<1]==a1)
            {
                swap(d[i],d[i<<1]);
                continue;
            }
            d[i]=a1;
            int dep1=search(i<<1,a2),dep2=search(i<<1|1,a2);
            if(dep1<dep2)
            d[i<<1]=a2,d[i<<1|1]=a3;
            else
            d[i<<1]=a3,d[i<<1|1]=a2;
            /*for(int j=1;j<=n;j++)
            printf("%2d ",d[j]);
            printf("\n");*/
        }
        for(int i=1;i<=n;i++)
        printf("%d ",d[i]);
        return 0;
    }
    
    

    只过了样例。。。

  • 1

信息

难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者