xdedb @ 2023-12-28 11:07:42
自己第一次尝试写归并,还是看着题解再去了解的,为什么自己写的归并大都tle了,有没有大佬看看!!!样例能过
#include <iostream>
#include <cstdio>
using namespace std;
void msort(int,int);
int num[500050],tmp[500050];
long long ans=0;
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
msort(0,n-1);
cout<<ans;
}
void msort(int start,int end){
int mid=start+(end-start)/2;
if(start!=end){
msort(start,mid);
msort(mid+1,end);
}else return;
int m=mid+1,s=start,st=start;
while(s <= mid && m<=end){
if(num[s]>num[m]){
ans=ans+mid-s+1;
tmp[st++]=num[m++];
}else if(num[s]<num[m]){
tmp[st++]=num[s++];
}
}
while(s<=mid){
tmp[st++]=num[s++];
}
while(m<=end){
tmp[st++]=num[m++];
}
for(int i=start;i<=end;i++){
num[i]=tmp[i];
}
}
by userLCX @ 2023-12-28 11:21:16
while(s <= mid && m<=end){
if(num[s]>num[m]){
ans=ans+mid-s+1;
tmp[st++]=num[m++];
}else if(num[s]<num[m]){
tmp[st++]=num[s++];
}//else tmp[st++]=num[s++];
}
相等也要选一个,不然就死循环了。
by GavinCQTD @ 2023-12-28 11:31:53
最难崩的一集
by xdedb @ 2023-12-28 14:53:43
@userLCX 谢谢佬,我好笨哈哈哈哈