专栏文章
树状数组一
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqmayi4
- 此快照首次捕获于
- 2025/12/04 07:07 3 个月前
- 此快照最后确认于
- 2025/12/04 07:07 3 个月前
由于归并排序时,左右子序列都是排好序的,所以我们只要在右序列的元素元素进入序列时,统计左序列进入了多少个元素,就是逆序对的数量(因为右序列的每一个元素都能与左序列的每一个元素构成一个逆序对)。
注意事项:
1.开long long
2.记得把剩下的元素放入数组里
3.多测要清空
4.return的值和边界条件
Code:
CPP注意事项:
1.开long long
2.记得把剩下的元素放入数组里
3.多测要清空
4.return的值和边界条件
Code:
#include<iostream>
#include<cstring>
using namespace std;
int n,arr[500001],t[500001];
long long f(int l,int mid,int r){
int i=l,j=mid+1,k=l;
long long ans=0;
while(i<=mid && j<=r){
if(arr[i]<=arr[j]){
t[k++]=arr[i++];
}else{
t[k++]=arr[j++];
ans+=j-k;
}
}
while(i<=mid) t[k++]=arr[i++];
while(j<=r) t[k++]=arr[j++];
for(int i=l;i<=r;i++) arr[i]=t[i];
return ans;
}
long long merge(int l,int r){
if(l>=r) return 0;
int mid=(l+r)/2;
return merge(l,mid)+merge(mid+1,r)+f(l,mid,r);
}
int main(){
cin>>n;
while(n!=0){
memset(t,0,sizeof(t));
for(int i=1;i<=n;i++) cin>>arr[i];
cout<<merge(1,n)<<endl;
cin>>n;
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...