二分55pts WA 回必关
查看原帖
二分55pts WA 回必关
1050426
lxy_qwq楼主2025/7/21 11:46
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
#define int long long
int n, m;
int qzh[MAXN];
int b[MAXN];
struct Node {
	int v, id;
	friend bool operator < (const Node& x, const Node& y) {
		return x.v < y.v;
	}
}a[MAXN];
main() {
	cin >> n;
	a[0].v = INT_MIN;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].v;
		a[i].id = i;
	}
	cin >> m;
	sort(a + 1, a + 1 + n);
	qzh[1] = a[1].v;
	for (int i = 2; i <= n; i++) {
		qzh[i] = qzh[i - 1] + a[i].v;
	}
	for (int i = 1; i <= n; i++) {
		b[a[i].id] = i;
	}
	long long result = 0;
	for (int i = 1; i <= n; i++) {
		result += i * a[i].v;
	}
	while (m--) {
		int i, j;
		cin >> i >> j;
		if (a[b[i]].v > j) {
			int l = 1, r = n;
			int ans = b[i];
			while (l <= r) {
				int mid = (l + r) / 2;
				if (a[mid].v > j) {
					r = mid - 1;
					ans = mid;
				}
				else {
					l = mid + 1;
				}
			}
			cout << result + (j * ans - a[b[i]].v * b[i]) + (qzh[b[i] - 1] - qzh[ans - 1]) << endl;
		}
		else {
			int l = 0, r = n;
			int ans = b[i];
			while (l <= r) {
				int mid = (l + r) / 2;
				if (a[mid].v > j) {
					r = mid - 1;
					ans = mid;
				}
				else {
					l = mid + 1;
				}
			}
			cout << result + (j * (ans - 1) - a[b[i]].v * b[i]) + (qzh[b[i]] - qzh[ans - 1]) << endl;
		}
	}
	return 0;
}
2025/7/21 11:46
加载中...