CF1933E 题解

思路

很明显 ss 越接近 2u+12\frac{2u+1}2 答案越大,于是我们可以定义一个前缀和数组 aa,然后二分找到最后一个 2u+12\le\frac{2u+1}2 的数和第一个 2u+12\ge\frac{2u+1}2 的数,比较一下两个数距离 2u+12\frac{2u+1}2 的距离哪个小就输出哪个。

题解

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
const int inf = 2e9;
int t, n, q, a[100005], l, r, u, ans1, ans2;
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> t;
	while (t --) {
		cin >> n;
		for (int i = 1; i <= n; ++ i)
			cin >> a[i], a[i] += a[i - 1];
		cin >> q;
		while (q --) {
			cin >> l >> u;
			r = lower_bound (a + 1, a + 1 + n, u + a[l - 1]) - a;
			ans2 = inf;
			if (r <= n)
				ans1 = r, ans2 = a[r] - a[l - 1] - u;
			if (-- r >= l && u + a[l - 1] - a[r] < ans2)
				ans1 = r;
			cout << ans1 << ' ';
		}
		cout << '\n';
	}
	return 0;
}
posted @ 2024-04-01 13:49  Vitamin_B  阅读(8)  评论(0)    收藏  举报  来源