AcWing 113. 特殊排序

原题链接
考察:二分
错误思路:
  分治.将第一个数和其他所有数比较完后,确定第一个数的位置.然后递归左右半边.
  只过了10个数据,剩下的超过10000次.
思路:
  vector装已经排好的序列,对于新的枚举数,二分求适合它的位置.

Code

// Forward declaration of compare API.
// bool compare(int a, int b);
// return bool means whether a is less than b.

class Solution {
public:
    vector<int> v;
    vector<int> specialSort(int N) {
       v.push_back(1);
       for(int i=2;i<=N;i++)
       {
           int l = 0,r = v.size()-1;
           while(l<r)
           {
               int mid = l+r>>1;
               if(!compare(v[mid],i)) r = mid;
               else l = mid+1;
           }
           v.push_back(i);
           if(compare(v[r],i)) r++;
           for(int i=v.size()-2;i>=r;i--) swap(v[i+1],v[i]);
       }
       return v;
    }
//     void cmp(vector<int> T,int sta){
//         if(T.size()==0) return;
//         vector<int> L,R;
//         for(int i=1;i<T.size();i++)
//           if(!compare(T[0],T[i])) L.push_back(T[i]);
//           else R.push_back(T[i]);
//         v[sta+L.size()] = T[0];
//         printf("%d %d\n",cnt+L.size(),T[0]);
//         cmp(L,sta);
//         cmp(R,sta+L.size()+1);
//     }
};
posted @ 2021-06-24 09:56  acmloser  阅读(24)  评论(0编辑  收藏  举报