归并排序0分求助

P1774 最接近神的人

两个错误 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


|