「二分答案 + 前缀和」防线
防线
题目链接:防线
题目大意
给你\(n\)件物品,每件物品 3 个信息,起点,终点,每次可以延伸的距离,从起点开始每一个延伸的距离上都会放一个物品,现在问你哪个位置上放的物品是奇数个
题目题解
挺裸的一道二分题,看了下题不好判断二分性,因为本题规定了最多只能出现一个奇数位,考虑用前缀,因为 奇数 + 偶数 = 奇数 那么就好判断了,如果当前位的前缀仍然是奇数,那么就向左,否则向右
//#define fre yes
#include <cstdio>
#include <iostream>
const int N = 2000005;
struct Node {
long long s, e, d;
}a[N];
int n;
long long l, r;
long long check(long long x) {
long long ans = 0;
for (int i = 1; i <= n; i++) {
if(a[i].s <= x) {
ans += (std::min(x, a[i].e) - a[i].s) / a[i].d + 1;
}
} return ans;
}
int main() {
static int t;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d %d %d", &a[i].s, &a[i].e, &a[i].d);
}
l = 0, r = (1 << 31) - 1;
while(l < r) {
long long mid = (l + r) >> 1;
if(!(check(mid) & 1)) l = mid + 1;
else r = mid;
}
long long ans = check(r) - check(r - 1);
if(ans) {
printf("%lld %lld\n", l, ans);
} else puts("There's no weakness.");
} return 0;
}