PioneerAlexander

Untitled

Oct 27th, 2021
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. vector<int> v;
  8.  
  9. long long mergeAndCount(int l, int m, int r) {
  10.  
  11. long long cnt = 0;
  12. int i = l, j = m + 1, y = l;
  13. auto b = v;
  14.  
  15. while (m - i >= 0 && r - j >= 0) {
  16. if (v[i] < v[j]) {
  17. b[y] = v[i];
  18. i++;
  19. } else {
  20. cnt += m - i + 1;
  21. b[y] = v[j];
  22. j++;
  23. }
  24. y++;
  25. }
  26. if (i > m) {
  27. for (int k = j; k <= r; k++) {
  28. b[y] = v[k];
  29. y++;
  30. }
  31. } else {
  32. for (int k = i; k <= m; k++) {
  33. b[y] = v[k];
  34. y++;
  35. }
  36. }
  37. v = b;
  38. return cnt;
  39. }
  40.  
  41.  
  42. long long countInversions(int l, int r) {
  43. if (r - l < 1) {
  44. return 0;
  45. }
  46. int m = (r + l) / 2;
  47.  
  48. auto res = countInversions(l, m);
  49. res += countInversions(m + 1, r);
  50. res += mergeAndCount(l, m, r);
  51. return res;
  52. }
  53.  
  54. int main() {
  55. ios_base::sync_with_stdio(false);
  56. cin.tie();
  57. cout.tie();
  58.  
  59. int n, x;
  60. cin >> n;
  61.  
  62.  
  63. for (int i = 0; i < n; i++) {
  64. cin >> x;
  65. v.push_back(x);
  66. }
  67. cout << countInversions(0, v.size() - 1);
  68. }
  69.  
  70.  
  71.  
  72.  
  73.  
Advertisement
Add Comment
Please, Sign In to add comment