归并
我想写个指针怎么就这么难
挂掉的指针代码
#include
using namespace std;
int n,a[100010];
int p1,p2;
void merge(int p1,int mid,int p2)
{
int n1=mid-p1+1,n2=p2-mid;
int *l=new int[n1],*r=new int[n2];
for(int i=0;i
过掉的数组代码
#include
#include
#include
#include
#include
#include
using namespace std;
int n,a[500010],ans[500010];
long long cnt;
void merge(int p1,int p2)
{
if(p1==p2)return;
int mid=(p1+p2)/2,i=p1,j=mid+1,k=p1;
merge(p1,mid);
merge(mid+1,p2);
while(i<=mid&&j<=p2)
{
if(a[i]<=a[j])ans[k++]=a[i++];
else
{
ans[k++]=a[j++];
cnt+=mid-i+1;
}
}
while(i<=mid)
ans[k++]=a[i++];
while(j<=p2)
ans[k++]=a[j++];
for(int l=p1;l<=p2;l++)
a[l]=ans[l];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
merge(1,n);
printf("%lld",cnt);
return 0;
}
//可能写指针不是个好兆头把(误
//另外:STL大法好啊
merge(first1,last1,first2,last2,result,compare);见瑞士轮
result为存放结果的容器,comapre为比较函数(可略写,默认为合并为一个升序序列)。