萌新求助分治
查看原帖
萌新求助分治
114914
一只书虫仔楼主2021/3/14 12:24

样例输出了一个奇怪数(

#include <bits/stdc++.h>

using namespace std;

struct point {
	long long v;
	long long x;
};

bool cmpv (point x, point y) {
	return x.v < y.v;
}

point a[50086];
long long ans = 0;
long long sum[50086];
point tmp[50086];

void solve (int l, int r) {
	if (l == r) return;
	int mid = (l + r) / 2;
	solve(l, mid);
	solve(mid + 1, r);
	for (int i = l; i <= r; i++) sum[i] = sum[i - 1] + a[i].x;
	int i = l;
	for (int j = mid + 1; j <= r; j++) {
		while (a[i].x <= a[j].x)
			i++;
		i--;
		ans += a[j].v * ((i - l + 1) * a[j].x - sum[i] + sum[mid] - sum[i] - (mid - i) * a[j].x);
	}
	i = l;
	int j = mid + 1, tmpp = l;
	while (i <= mid && j <= r) {
		if (a[i].x > a[j].x) {
			tmp[tmpp] = a[j];
			tmpp++, j++;
		} else {
			tmp[tmpp] = a[i];
			tmpp++, i++;
		}
	}
	for (int k = i; k <= mid; k++) {
		tmp[tmpp] = a[k];
		tmpp++;
	}
	for (int k = j; k <= r; k++) {
		tmp[tmpp] = a[k];
		tmpp++;
	}
	for (int k = j + 1; k <= r; k++) tmp[k] = a[k];
	for (int k = l; k <= r; k++) a[k] = tmp[k];
	return;
}

int main () {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%lld%lld", &a[i].v, &a[i].x);
	sort(a + 1, a + n + 1, cmpv);
	solve(1, n);
	printf("%lld", ans);
	return 0;
}
2021/3/14 12:24
加载中...