Q-Tavas and Karafs

本文针对一个复杂的Codeforces题目进行解析,题目涉及等差数列和序列操作,通过算法求解在限定次数内使数列中尽可能多的元素变为0的最大长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
Karafs is some kind of vegetable in shape of an 1 × h rectangle. Tavaspolis people love Karafs and they use Karafs in almost any kind of food. Tavas, himself, is crazy about Karafs.

Each Karafs has a positive integer height. Tavas has an infinite 1-based sequence of Karafses. The height of the i-th Karafs is si = A + (i - 1) × B.

For a given m, let’s define an m-bite operation as decreasing the height of at most m distinct not eaten Karafses by 1. Karafs is considered as eaten when its height becomes zero.

Now SaDDas asks you n queries. In each query he gives you numbers l, t and m and you should find the largest number r such that l ≤ r and sequence sl, sl + 1, …, sr can be eaten by performing m-bite no more than t times or print -1 if there is no such number r.

Input
The first line of input contains three integers A, B and n (1 ≤ A, B ≤ 106, 1 ≤ n ≤ 105).

Next n lines contain information about queries. i-th line contains integers l, t, m (1 ≤ l, t, m ≤ 106) for i-th query.

Output
For each query, print its answer in a single line.

Sample Input
Input
2 1 4
1 5 3
3 3 10
7 10 2
6 4 8
Output
4
-1
8
-1
Input
1 5 2
1 5 10
2 7 4
Output
1
2

这个题一看就是codeforces的,巨难懂,看了n遍……
就是给你一个等差数列,后要求如果每次可以最多选择m个数
使这m个数-1 那么在t次操作中可以使l为左端点的最长序列中使所有数为0 输出这个最长序列的右端序号

#include<stdio.h>
long long  a,b,n;//给的空间大应该要用long 
long long l,t,m;  
long long an(long long x)  
{  
    return a+(x-1)*b;  
}  

long long get_sum(long long r)  
{  
    return (an(r)+an(l))*(r-l+1)/2;  
}  

int main()  
{  
    long long i,j,k;  
    while(~scanf("%I64d%I64d%I64d",&a,&b,&n))  
    {  
        while(n--)  
        {  
            scanf("%I64d%I64d%I64d",&l,&t,&m);  
            if(an(l)>t)  
            {  
                printf("-1\n");  
                continue;  
            }  
            long long lle= l;
            long long lri=(t-a)/b+1;
            long long mid;  
            while(lle<=lri)  
            {  
                long long mid = (lle+lri)/2;  
                if(get_sum(mid)<=t*m) 
                    lle = mid+1;  
                else 
                    lri = mid-1;  
            }  
            printf("%d\n",lle-1);  
        }  
    }  

    return 0;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值