题目传送门:
http://codeforces.com/problemset/problem/847/B
此归并排序题意是让你将一串数字进行排序,第i行的末尾数字要比第i+1行的末尾数字,这时我们必须使用二分查找的方法,将时间复杂度n方将为nlogn。
ac代码:
#include<iostream>
#include<cstring>
#include <vector>
using namespace std;
const int maxn = 2e5+10;
int a[maxn];
int lena;
vector<int>b[maxn];
vector<int>::iterator it;
int mid_find(int ans){
int times = 0;
int mid;
int left = 1, right = lena;
if(lena < 1)
return 1;
while(left <= right){
mid = (left + right) >> 1;
if(ans > a[mid] && (mid-1==0 || ans < a[mid-1]))
{
return mid;
}
else if(ans < a[mid])
{
left = mid+1;
}
else if(ans > a[mid] && (mid-1==0 || ans > a[mid-1]))
{
right = mid-1;
}
else if(ans == a[mid])
left = mid + 1;
}
return left;
}
int main(){
int n,tmp;
scanf("%d",&n);
lena = 0;
for(int i=1; i<=n; ++i){
int k;
scanf("%d",&k);
tmp = mid_find(k);
b[tmp].push_back(k);
a[tmp] = k;
if(tmp>lena)
{
lena = tmp;
}
}
for(int i = 1;i<=lena;i++)
{
/*for(it = b[i].begin(); it != b[i].end(); ++it){
cout << it << endl;
}*/
for(int j=0; j<b[i].size(); ++j){
cout << b[i][j] << " ";
}
if(i!=lena)
puts("");
}
}//