「二分答案 + 前缀和」防线

防线

题目链接:防线

题目大意

给你\(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;
}

posted @ 2019-09-12 17:27  Nicoppa  阅读(177)  评论(0编辑  收藏  举报