1 条题解
-
0
- 暴力解法:枚举 i,j,复杂度
- 正解:利用归并排序的特点。
- 注意开 long long.
#include <bits/stdc++.h> using namespace std; using ll = long long; const ll P = 1e9 + 7; const int N = 5e6 + 5; int n,k, a[N], tem[N]; ll cnt=0; void qsort(int l, int r) { // [l, r] = [l, j] + [i, r] if (l >= r) return; int i = l, j = r, base = a[l + r >> 1]; while (i <= j) { // [l,j] <= b, [i,r] >=b while (a[i] < base) i++; while (a[j] > base) j--; if (i <= j) swap(a[i], a[j]), i++, j--; } if(k <=j) qsort(l, j); if(k >=i) qsort(i, r); } // [l, r] = [l,mid] + [mid+1, r] void msort(int l,int r){ if(l>=r) return; int mid =l +r >> 1; msort(l,mid); msort(mid+1, r); int i=l, j=mid+1, p=0; while(i<=mid && j<=r){ if(a[i] <= a[j]) tem[++p] = a[i++]; else tem[++p] = a[j++], cnt += mid-i+1; } while(i <= mid) tem[++p] = a[i++]; while(j <= r) tem[++p] = a[j++]; for(int i=1; i<=p; i++) a[l++]=tem[i]; } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &a[i]); msort(0, n-1); printf("%lld", cnt); return 0; }
- 1
信息
- ID
- 306
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 41
- 已通过
- 11
- 上传者