题目:https://dsa.cs.tsinghua.edu.cn/oj/problem.shtml?id=1142
代码:
#include<cstdio>
#define MAXSIZE 500000
using namespace std;
int *b=new int[MAXSIZE];
int BinarySearch(int *a,int lo,int hi,int e)
{
while(lo<hi)
{
int mi=(lo+hi)>>1;
e<a[mi]?hi=mi:lo=mi+1;
}
return --lo;//lo为大于e的最小秩,lo-1为不大于e的最大秩
}
void Merge(int *elem,int lo,int mi,int hi)
{
int *a=elem+lo;
int lb=mi-lo;
for(int i=0;i<lb;b[i]=a[i++]);
int *c=elem+mi;
int lc=hi-mi;
for(int i=0,j=0,k=0;j<lb||k<lc;)
{
if(j<lb&&(lc<=k||b[j]<=c[k]))a[i++]=b[j++];
if(k<lc&&(lb<=j||c[k]<b[j]))a[i++]=c[k++];
}
}
void MergeSort(int *elem,int lo,int hi)
{
if(lo+1<h