【二分答案】luogu_P4403 秦腾与教学评估

题意

给出若干个参数\(S_i\), \(E_i\), \(D_i\),表示在\(S_i\sim E_i\)内,每\(D_i\)个位置就有一个人。
最多只有一个位置上的人数是奇数,求出这个位置及人数。

总人数不大于\(10^8\)
数据范围:
\(Si ≤ Ei\)
\(1 ≤ T ≤ 5\)
\(N ≤ 200000\)
\(0 ≤ Si, Ei, Di ≤ 2^31 – 1\)
输入文件的大小不大于\(2048KB\)

思路

因为只有一个位置上的人是奇数,根据奇偶相加的性质,发现出现这个位置的地方具有单调性,故二分答案即可。

代码

#include <cstdio>
#include <algorithm>

int t, n;
int s[200001], e[200001], d[200001];

int S(int p) {
	int res = 0;
	for (int i = 1; i <= n; i++)
		if (s[i] <= p)
			res += (std::min(e[i], p) - s[i] + d[i]) / d[i];
	return res;
}

int main() {
	scanf("%d", &t);
	for (; t; t--) {
		scanf("%d", &n);
		for (int i = 1; i <= n; i++)
			scanf("%d %d %d", &s[i], &e[i], &d[i]);
		if (!(S(2147483647) & 1))
			printf("Poor QIN Teng:(\n");
		else {
			int l = 1, r = 2147483647;
			while (l < r) {
				int mid = (long long)l + r >> 1;
				if (S(mid) & 1)
					r = mid;
				else
					l = mid + 1;
			}
			printf("%d %d\n", r, S(r) - S(r - 1));
		}
	}
}

注意计算人数

posted @ 2021-08-10 19:38  nymph181  阅读(37)  评论(0)    收藏  举报