我写了一个函数,对一个 pair<int, int> 数组 a 中每个 pair 的 second 进行排序并求逆序对。
数据是保证每个 second 互不相同的。
这个函数导致 WA,大佬能不能帮忙看看,是哪儿有问题。(本人以前也写过几次归并,都过了,不知道为什么现在就过不去)
int mergeSortAndGetNRvsPair(pair<int, int> *a, int l){
static int tmp[100000]; // 排序的结果暂存数组
if(l<=1){
return 0;
}
int res = mergeSortAndGetNRvsPair(a, l>>1) +
mergeSortAndGetNRvsPair(a+(l>>1), l+1>>1); // 分成长度为 l>>1, l+1>>1 (也可以理解成 l/2, l-l/2) 的两段,res 为逆序对个数
int tmpL=0; // 已经放入结果的数的个数
for(int ltTag=0, rtTag=l>>1; ltTag<l>>1 || rtTag<l; ){ // 归并排序的两个遍历的变量
if(ltTag<l>>1 && (rtTag>=l || a[ltTag].second<a[rtTag].second)){
tmp[tmpL++]=a[ltTag++].second;
}else{
tmp[tmpL++]=a[rtTag++].second;
res += (l>>1)-ltTag; // 更新逆序对数量
}
}
for(int i=0; i<l; ++i){
a[i].second = tmp[i]; // 把暂存结果存回原数组
}
return res;
}