Codeforces Round #299 (Div. 2) Tavas and Karafs(二分)

英语渣渣感觉无力。。。翻了下题解才知道题意。。。

给你一个无限长的等差数列a,n个查询。对于每个查询,给出l,t,m,求最大的r。表示在等差数列a的第l号元素到第r号元素,执行t次操作,对于每一次操作,在[l,r]区间内选出m个数,并且把这m个数-1,执行完t次操作后,使得区间[l,r]内的数全部为0,求区间最大的右端点r。

如果t小于a[l],那么执行完t次操作a[l]也不会为0,输出-1

那么同理我们可以求出r的范围,r肯定小于等于(t-a)/b,因为数列是递增的。

既然我们都已经知道了范围了,接下来就很容易想到二分。

限制条件:sum(l,r) <= t*m否则不能把所有数都清成0。

#include<cstdio>
#define LL long long
using namespace std;
LL l,t,m;
LL a,b,n;
LL F(LL x)//注意开LL
{
	return a + (x-1)*b;
}
LL get_sum(LL l,LL r)
{
	return (F(l) + F(r))*(r-l+1)/2;
}
int main()
{
	scanf("%I64d%I64d%I64d",&a,&b,&n);
	for(int i = 1; i <= n; i++)
	{
		scanf("%I64d%I64d%I64d",&l,&t,&m);
		if(F(l) > t)
		{
			printf("-1\n");
			continue;
		}
		LL mid , rrr = (t-a)/b+1, lll =l;//一定要另外保存一个left,不要与输入的那个l混淆,因为我们二分求的是右端点
		while(lll <= rrr)
		{
			mid = (lll+rrr)/2;
			if(get_sum(l,mid) <= t*m) lll = mid+1;
			else rrr = mid-1;
		}
		printf("%I64d\n",lll-1);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 12:53:37

Codeforces Round #299 (Div. 2) Tavas and Karafs(二分)的相关文章

DFS Codeforces Round #299 (Div. 2) C. Tavas and Karafs

题目传送门 1 /* 2 DFS:按照长度来DFS,最后排序 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <iostream> 8 #include <cmath> 9 #include <vector> 10 using namespace std; 11 12 const int MAXN = 1e3 + 10; 1

二分搜索 Codeforces Round #299 (Div. 2) C. Tavas and Karafs

题目传送门 1 /* 2 题意:给定一个数列,求最大的r使得[l,r]的数字能在t次全变为0,每一次可以在m的长度内减1 3 二分搜索:搜索r,求出sum <= t * m的最大的r 4 详细解释:http://blog.csdn.net/libin56842/article/details/45082747 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #includ

水题 Codeforces Round #299 (Div. 2) A. Tavas and Nafas

题目传送门 1 /* 2 很简单的水题,晚上累了,刷刷水题开心一下:) 3 */ 4 #include <bits/stdc++.h> 5 using namespace std; 6 7 char s1[11][10] = {"zero", "one", "two", "three", "four", "five", "six", "seven

Codeforces Round #262 (Div. 2) 460C. Present(二分)

题目链接:http://codeforces.com/problemset/problem/460/C C. Present time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Little beaver is a beginner programmer, so informatics is his favorite subjec

Codeforces Round #470 (Div 2) B 数学 C 二分+树状数组 D 字典树

Codeforces Round #470 B. Primal Sport 数学题,对 x2 和 x1 分解质因子即可. #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b;

Codeforces Round #299 (Div. 1)C. Tavas and Pashmaks (凸壳)

C. Tavas and Pashmaks Tavas is a cheerleader in the new sports competition named "Pashmaks". This competition consists of two part: swimming and then running. People will immediately start running R meters after they finished swimming exactly S 

Codeforces Round #299 (Div. 2) A. Tavas and Nafas

题目链接:http://codeforces.com/problemset/problem/535/A #include <iostream> #include <string> using namespace std; int main() { string s1[10]={"zero","one","two","three","four","five",&qu

Codeforces Round #299 (Div. 2)D. Tavas and Malekas

KMP,先预处理按每个节点标记,扫一遍更新每个匹配位置,最后kmp判断是否有重合而且不相同的地方 注意处理细节,很容易runtime error #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #inclu

Codeforces Round #353 (Div. 2) D. Tree Construction (二分,stl_set)

题目链接:http://codeforces.com/problemset/problem/675/D 给你一个如题的二叉树,让你求出每个节点的父节点是多少. 用set来存储每个数,遍历到a[i]的时候查找比a[i]大的数的位置,然后插入,而父亲就是刚好比a[i]小的数或刚好大的数. 然后讨论是哪一个数. 比如给你3 1 2 ,如图 1的父亲是3 ,2的父亲是1. 那我其实只要找左边或右边出现最晚的数就行了,用pair的first表示a[i],second表示出现的顺序i. 1 #include