您的位置:首页 > 其它

Q(这个题提交失败,但样例是对的QAQ,好像服务器有问题,不能提交)

2017-05-01 22:02 267 查看
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

题目分析
这个题目蛮难读的,谷歌翻译还不如自己翻译QAQ

现在给你一个以A为基,B为公差的等差数列(无现长),其中有N个询问。
对于N个询问,每个询问有三个元素,l,t,m;
表示我们现在有t次操作,每次可以选择m个数将其都-1.
现在问你能够使得以l为起点,r为终点最远的r,区间【l,r】所有数都减少为0.解题思路

显然这个终点r越远,需要的操作就越多,其具有单调性,那么我们二分终点。进行判断。
如果当前终点可行,那么让这个终点更远一些,否则就更近一些。
源代码
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
long long A,B,n;
long long get(long long mid)
{
    return A+(mid-1)*B;
}
long long gs(long long l,long long r)
{
    long long rr=(A+A+(r-1)*B)*r/2;
    long long lll=(A+A+(l-2)*B)*(l-1)/2;
    return rr-lll;
}
int main()
{
    while(~scanf("%I64d%I64d%I64d",&A,&B,&n))
    {
        for(long long i=0;i<n;i++)
        {
            long long s,t,m;
            scanf("%I64d%I64d%I64d",&s,&t,&m);
            long long left=s;
            long long right=1000000000;
            long long ans=-1;
            while(right-left>=0)
            {
                long long  mid=(right+left)/2;
                if(get(mid)>t)rig
4000
ht=mid-1;
                else
                {
                    if(gs(s,mid)>m*t)
                    {
                        right=mid-1;
                    }
                    else
                    {
                        ans=mid;
                        left=mid+1;
                    }
                }
            }
            printf("%d\n",ans);
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐