两个错误
1.
```cpp
while(i <= mid && j <= r){
if(a[i] < a[j]) b[cnt++] = a[i++];
else b[cnt++] = a[j++], ans = ans - cnt + j;
}
```
改成
```cpp
while(i <= mid && j <= r){
if(a[i] <= a[j]) b[cnt++] = a[i++];
else b[cnt++] = a[j++], ans += mid - i + 1;
}
```
2.
快读错了,你这个读不了负数!!
给你个快读板子
```cpp
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return x * f;
}
```
by Z_M__ @ 2021-06-12 12:48:53
好像只有快读错了
第一个没错
by Z_M__ @ 2021-06-12 12:52:07
@[Z_M__](/user/390254) ,改了以后还是全WA……
```cpp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + 50;
long a[MAXN], b[MAXN];
long long ans;
void merge_sort(int l, int r){
if(l == r) return;
int mid = (l + r) >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
int i = l, j = mid + 1, cnt = l;
while(i <= mid && j <= r){
if(a[i] < a[j]) b[cnt++] = a[i++];
else b[cnt++] = a[j++], ans = ans - mid + i;
}
while(i <= mid) b[cnt++] = a[i++];
while(j <= r) b[cnt++] = a[j++], ans = ans - mid + i;
for(int p = l; p <= r; ++p) a[p]=b[p];
}
int read(){
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9'){
if (ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return x * f;
}
int main(){
int n = read();
for(int i = 1; i <= n; ++i) a[i] = read();
merge_sort(1, n);
cout << ans;
return 0;
}
```
by _llltd14_ @ 2021-06-12 13:50:37
这段还是错的
```cpp
while(i <= mid && j <= r){
if(a[i] < a[j]) b[cnt++] = a[i++];
else b[cnt++] = a[j++], ans = ans - mid + i; // 改成 ans = ans + mid - i + 1
}
```
by Z_M__ @ 2021-06-12 13:58:09
还有个错误
```
while(i <= mid && j <= r){
if(a[i] < a[j]) b[cnt++] = a[i++]; // 改成 if (a[i] <= a[j]) b[cnt++] = a[i++];
else b[cnt++] = a[j++], ans = ans - mid + i; // 改成 ans = ans + mid - i + 1
}
by Z_M__ @ 2021-06-12 14:03:03
@[Z_M__](/user/390254) ,谢谢,A了
by _llltd14_ @ 2021-06-13 10:16:54