CodeForces 535C Tavas and Karafs

给你两个整数A,B.
给你一个无限长的序列,这个序列的第i个数字为A+(i-1)*B
定义一个"m变态操作"为将不超过m个不同位置上的数字递减1.
现在给你n个询问,每个询问由l,t,m决定.
表示问你是否存在一个r,使得a[l],a[l+1],a[l+2]..a[r]这一段的数字,能在进行不超过t次"m变态操作"的
限制下,全都变成0.
(各个询问都是独立的,就是说,每个询问都是对原序列进行询问,而不是改变后的序列)
如果存在,则输出最大的r,否则,输出-1.
Input
第一行3个整数,A,B,N.(1<=A,B<=10^6,1<=n<=10^5)
接下来n行,每行3个数字l,t,m表示每个询问.(1<=l,t,m<=10^6)
Output
对于每一个询问,输出其对应的答案。
Example
输入
2 1 4
1 5 3
3 3 10
7 10 2
6 4 8
输出
4
-1
8
-1
输入
1 5 2
1 5 10
2 7 4
输出
1
2

这一题当时翻译了很久,最后才知道就是一个简单的二分,我们可以枚举一个区间[l,r],下界l 毫无疑问就是题目中输入的l,而上界 r却不是t,由前n项和公式可得,因为最多操作t次,所以要想将某一项减为0,必须满足:  ,所以: (判定条件一),所以我们只需要二分[l,r]这个区间就可以了。然后就是确定二分的判断条件,由等差数列的前n项公式可得:,根据以上公式可以得到判定条件: (判定条件二)。具体请看代码分析:

#include <stdio.h>
#include <string.h>
#define ll long long
#define s(i) A+(i-1)*B    //求第i项
#define sum(x) (s(l) + s(x)) * (x - l + 1) / 2    //求第l项到第x项的和
ll A, B, n;
ll l, t, m;
int judge(int x) { //判定条件
    if(sum(x) <= t*m && s(x) <= t) //两个判断条件
        return 1;
    return 0;
}
int main() {
    while(~scanf("%lld %lld %lld", &A, &B, &n)) {
        for(int i = 0; i < n; i++) {
            scanf("%lld %lld %lld", &l, &t, &m);
            if(s(l) > t) { //如果下界l大于t,直接输出-1,
                puts("-1");
                continue;
            }
            ll left = l, right = (t-A)/B+1, mid;//确定上界和下界
            while(left + 4 < right) {   //二分的偷懒写法,缩小区间,然后小区间暴力,免去很多烦恼
                mid = (left+right)/2;
                if(judge(mid)) {
                    left = mid;
                }
                else right = mid;
            }
            for(ll i = right; i >= left; i--) { //小区间暴力
                if(judge(i)) {
                    printf("%lld\n", i); //得出结果。
                    break;
                }
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值