逆序对
void merge(int l,int r)//要计算l~r这个区间有多少个逆序对
{
if (l==r) return;
int m=(l+r) >> 1;//(l+r)/2
merge(l,m);//递归去算l~m的答案 a[l]~a[m] 排好序了
merge(m+1,r);//递归去算m+1~r的答案 a[m+1]~a[r] 排好序了
//i在左边 j在右边的答案
int p1 = l, p2 = m+1;
for (int i=l;i<=r;i++)
{
if (p1 > m) b[i] = a[p2],p2++;
else if (p2 > r) b[i] = a[p1],p1++;
else if (a[p1] <= a[p2]) b[i] = a[p1],p1++;
else b[i] = a[p2],p2++,ans+=m-p1+1;
}
for (int i=l;i<=r;i++)
a[i] = b[i];
}

浙公网安备 33010602011771号