Codeforces 535C Tavas and Karafs

本文介绍了一种解决特定等差数列问题的算法实现,该问题要求在给定的操作次数和每次操作可减数值的情况下,找到能将数列元素全部变为0的最大范围。通过二分查找的方法确定最优解。

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

大概是熬夜熬到脑子都不清醒了,废了九牛二虎之力才好不容易看懂题意,结果还是没做出来。

题意:一个等差数列,一次可以把m个数减一,有t次机会,问能使sl,sl+1,...,sr都为0的最大r。

思路:因为是一个递增的等差数列,而且可以推出,[l,r]中最大的h小于等于t,由此可以确定右边界,sum[l,r]小于等于t*m,由此可以

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<cmath>
#include<ctime>
#define mx 200005
#define LL long long 
#define mod 1000000009
#define esp 1e-12
const double PI = acos(-1.0);

using namespace std;

int a, b, n, l, t, m;

LL getv(LL p)
{
	return a + (p - 1) * b;
}


LL getsum(LL r)
{
	return (getv(r) + getv(l)) * (r - l + 1) / 2;
}


int main()
{
	cin >> a >> b >> n;
	while (n--)
	{
		cin >> l >> t >> m;
		if (getv(l) > t) cout << "-1\n";
		else
		{
			LL le = l, ri = (t - a) / b + 1, mid;
			while (le <= ri)
			{
				mid = (ri + le) / 2;
				if (getsum(mid) <= t * m) le = mid + 1;
				else ri = mid - 1;
			}
			cout << le - 1 << endl;
		}
	}
	return 0;
}

二分答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值