Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <vector>
- using namespace std;
- vector<int> v;
- long long mergeAndCount(int l, int m, int r) {
- long long cnt = 0;
- int i = l, j = m + 1, y = l;
- auto b = v;
- while (m - i >= 0 && r - j >= 0) {
- if (v[i] < v[j]) {
- b[y] = v[i];
- i++;
- } else {
- cnt += m - i + 1;
- b[y] = v[j];
- j++;
- }
- y++;
- }
- if (i > m) {
- for (int k = j; k <= r; k++) {
- b[y] = v[k];
- y++;
- }
- } else {
- for (int k = i; k <= m; k++) {
- b[y] = v[k];
- y++;
- }
- }
- v = b;
- return cnt;
- }
- long long countInversions(int l, int r) {
- if (r - l < 1) {
- return 0;
- }
- int m = (r + l) / 2;
- auto res = countInversions(l, m);
- res += countInversions(m + 1, r);
- res += mergeAndCount(l, m, r);
- return res;
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie();
- cout.tie();
- int n, x;
- cin >> n;
- for (int i = 0; i < n; i++) {
- cin >> x;
- v.push_back(x);
- }
- cout << countInversions(0, v.size() - 1);
- }
Advertisement
Add Comment
Please, Sign In to add comment