在一个数组中,如果两个元素 a[i] 和 a[j] 满足 i < j 且 a[i] > a[j],则 a[i] 和 a[j] 是一个逆序对。下面代码可以正确统计数组 a 区间 [l,r] 内的逆序对总数。
long long cnt=0;
void merge_count(vector<int>& a, int l, int m, int r){
int i = l, j = m + 1;
while(i <= m && j <= r) {
if(a[i] <= a[j]) i++;
else {
cnt += (m - i + 1);
j++;
}
}
}仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】归并排序|逆序对统计|递归调用链
本题考查《GESP 考试大纲》五级"算法与程序设计"模块中归并排序与逆序对统计的综合运用。命题人卡住的是考生对merge 完整流程的认知——只背了计数逻辑,却忽略了数组排序本身。