[算进] 防线 题解

题目地址

ACwing题目地址

Solution

套路题。不会做只是我没见过这个套路而已

突破口: 但是整条防线上也最多只有一个位置有奇数个防具

我们知道一个原理 :偶+偶=偶,奇+偶=奇。

又因为我们可以快速算出一个前缀和,比如说算出 \(x\) 之前有多少个防具,(用等差数列的一些公式快速\(O(1)\)算出,因为有 \(n\) 个等差数列所以算一次前缀和的的时间是 \(O(n)\))。记 \(x\) 的前缀和为 \(S(x)\)

我们又发现如果答案(奇数)在 \(p\) 这个位置,\(\forall x \in [0,p)\) \(S(x)\) 都是偶数,而 \(\forall x \in [p,R)\) \(S(x)\) 都是奇数(\(R\) 是右边界)。这样就有了一个分界点,可以二分了。二分答案的位置。

时间复杂度 \(O(n \log L)\) \((n<=200000,L<=2^{31}-1)\),可以过。

Code

Talk is cheap.Show me the code.

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
inline int read() {
    int x=0,f=1; char ch=getchar();
    while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
    return x * f;
}
const int N = 200007;
int n,pos,ans;
int S[N],E[N],D[N];
int check(int x) {
    int res = 0, sum;
    for(int i=1;i<=n;++i) {
        if(x < S[i]) sum = 0;
        else sum = ((min(E[i],x)-S[i])/D[i]) + 1;
        res += sum;
    }
    return res;
}
void work() {
    int l = 1, r = -INF, mid, tmp;
    n = read();
    for(int i=1;i<=n;++i) S[i] = read(), E[i] = read(), D[i] = read(), r = max(r,E[i]);
    pos = -1;
    while(l <= r) {
        mid = (l+r)>>1;
        if(check(mid) & 1) {
            pos = mid, ans = check(mid) - check(mid-1);
            r = mid - 1;
        } else l = mid + 1;
    }
    if(pos==-1) puts("There's no weakness.");
    else printf("%d %d\n",pos,ans);
}
int main()
{
    int T = read();
    while(T--) work();
    return 0;
}

Summary

  • 这个题目让我学会了从奇偶性推导出单调性的套路

  • 让我学会了等差数列的一些小性质

全部评论

相关推荐

11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
11-13 20:32
门头沟学院 Java
面向未来编程code:我没看到他咋急,他不就问你个问题。。。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务