【二分答案】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));
}
}
}
坑
注意计算人数