AcWing 算法提高课 统计逆序对的数量
利用归并排序统计逆序对的数量
int n; int nums[500010]; int backup[500010]; LL MergeSort(int l,int r) { if(l==r) return 0; int mid=(l+r)/2; LL res=MergeSort(l,mid)+MergeSort(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid&&j<=r) { if(nums[i]<=nums[j]) backup[k++]=nums[i++]; else { //注意这里的统计方式,是为了在后面, //如果进入这里,说明j还有剩余,则i已经到了mid+1,不用改变res //否则,进入上面,也不用改变res res+=mid-i+1; //res+=j-mid; 这种写法统计的答案不足 backup[k++]=nums[j++]; } } while(i<=mid) backup[k++]=nums[i++]; while(j<=r) backup[k++]=nums[j++]; fore(id,l,r) { nums[id]=backup[id]; } return res; } void YD() { fore(i,1,n) { cin>>nums[i]; } cout<<MergeSort(1,n)<<endl; }

浙公网安备 33010602011771号