打卡蓝桥杯备战(每日五题)
作者:
陈.6.29
,
2024-02-20 15:11:28
,
所有人可见
,
阅读 49
using namespace std;
typedef long long ll;
const int N=100010;
int n;
int q[N],tmp[N];
ll merge_sort(int l,int r)
{
if(l>=r) return 0;
int mid= l + r >>1;
ll res =merge_sort(l,mid)+merge_sort(mid+1,r);
//归并的过程,前面一个二分
int k=0,i=l,j=mid+1;//分别为第一段的开头和第二段的开头
while(i<=mid&&j<=r)
if(q[i]<=q[j]) tmp[k++] =q[i++];
else
{
tmp[k++]=q[j++];
res += mid-i+1;//Sj等于mid-i+1个数,每次要输出q[j]时加mid-i+1
}
while (i<=mid) tmp[k++]=q[i++];//如果剩余左半边则全部加进去
while (j<=r) tmp[k++]=q[j++];//如果剩余右半边则全部加进去
//最后copy进去
for(int i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];
return res;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>q[i];
}
cout<<merge_sort(0,n-1)<<endl;
return 0;
}