翻转对
class Solution {
public:
int findpairs(vector<int> &nums, int l, int r) {
int mid = (l + r) >> 1;
int i = l, j = mid + 1;
int res = 0;
for (; i <= mid; ++i) {
while (j <= r && (1LL * nums[i] > 2LL * nums[j])) {
res += mid - i + 1;
++j;
}
}
return res;
}
int merge(vector<int> &nums, int nums2[], int l, int r) {
if (l >= r) return 0;
int res = 0;
int mid = (l + r) >> 1;
res = merge(nums, nums2, l, mid) + merge(nums, nums2, mid + 1, r) + findpairs(nums, l, r);
int i = l, j = mid + 1;
int id = l;
while (i <= mid && j <= r ) {
if (nums[i] <= nums[j]) nums2[id++] = nums[i++];
else nums2[id++] = nums[j++];
}
while (i <= mid) nums2[id++] = nums[i++];
while (j <= r) nums2[id++] = nums[j++];
for(int ind = l;ind <= r;ind++) nums[ind] = nums2[ind];
return res;
}
int reversePairs(vector<int>& nums) {
int n = nums.size();
int nums2[n];
if (n == 0) return 0;
return merge(nums, nums2, 0, n - 1);
}
};
小和问题
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define ll long long
int a[maxn];
int b[maxn];
ll find(int a[], int l, int r) {
if (l == r) return 0;
int mid = (l + r) >> 1;
int i = l, j = mid + 1;
ll res = 0;
for (; j <= r; ++j) {
while (i <= mid && a[i] <= a[j]) {
res += 1LL * (r - j + 1) * a[i];
i++;
}
}
return res;
}
ll merge(int a[], int b[], int l, int r) {
if (l >= r) return 0;
int mid = (l + r) >> 1;
int i = l, j = mid + 1, k = l;
ll res = merge(a, b, l, mid) + merge(a, b, mid + 1, r) + find(a, l, r);
while (i <= mid && j <= r) {
if (a[i] <= a[j]) b[k++] = a[i++];
else b[k++] = a[j++];
}
while (i <= mid) b[k++] = a[i++];
while (j <= r) b[k++] = a[j++];
for (int i = l; i < k; ++i) a[i] = b[i];
return res;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) cin >> a[i];
cout << merge(a, b, 0, n - 1);
return 0;
}