CF1810D Candies题解
CF1810D Candies
点击查看原题

点击查看思路
经典的小学数学奥数题。
设 \(a\) 为每天往上爬的高度,\(b\) 为每天向下降的高度,\(n\) 为给定的需要爬上去的天数。
请注意,第 \(n\) 天爬上去了,就不会下降了。

对于操作为 \(1\) 的,我们可以确定其范围。
因为要保证第 \(n\) 天就可以到达,且第 \(n - 1\) 天不能到达,所以其范围为标红部分:

用表达式表示为 \([(a - b) \times (n - 2) + a + 1, (a - b) \times (n - 1) + a]\),其中 \((a - b) \times (n - 2) + a\) 为第 \(n - 1\) 天可以到达的最大高度 \(+1\) 才可以符合题意;\((a - b) \times (n - 1) + a\) 为第 \(n\) 天可以到达的最大高度。
需要特判 \(n = 1\) 的情况,此时其范围为 \([1, a]\)。
如果这个区间与之前之前计算的结果有交集,那么就是可以保留的,并更新区间,否则就丢弃之。
对于操作类型为 \(2\) 的,我们先计算出爬上 \(l\) 的高度需要的时间 \(t\),计算方法如下。
假设高度为 \(h\)。
- 首先要预留一个 \(a\)。
- 然后计算 \(\left\lfloor\frac{h - a}{a - b}\right\rfloor\) 表示到达小于等于 \(h - a\) 的位置所需要的时间。
- 如果刚好到达 \(h - a\) 的位置 \(+1\) 就可以了,否则 \(+2\)。
注意最好不要直接上取整,因为容易引起精度问题。
这样就计算出了 \(t\),然后计算出花 \(t + 1\) 天爬上的高度范围是否与已知范围 \([l, r]\) 有交集,计算方法与前面的操作 \(1\) 类似,如果有那么证明不能准确获取其天数,输出 \(-1\),否则输出天数。
注意我们不能直接判断已知范围 \(l\) 是否等于 \(r\),因为有可能对于这一组询问在该区间内只有一种可能性,也是满足题意的。
点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
bool check(int& l1, int& r1, int l2, int r2, bool flag) {
int ll = max(l1, l2);
int rr = min(r1, r2);
if (ll > rr) return false;
if (flag) {
l1 = ll;
r1 = rr;
}
return true;
}
void solve() {
int q;
cin >> q;
int opt, a, b, c;
int l = -1, r = 1e18;
while (q--) {
cin >> opt;
if (opt == 1) {
cin >> a >> b >> c;
int lnew = -1, rnew = -1;
if (c == 1) lnew = 1, rnew = a;
else lnew = (a - b) * (c - 2) + a + 1, rnew = (a - b) * (c - 1) + a;
if (check(l, r, lnew, rnew, true)) cout << "1 ";
else cout << "0 ";
}
else {
cin >> a >> b;
int x = l, res = 0;
if (a >= l) {
res = 1;
}
else {
x -= a;
res = x / (a - b);
x = res * (a - b);
if (x == l - a) res++;
else res += 2;
}
c = res + 1;
int lnew = -1, rnew = -1;
if (c == 1) lnew = 1, rnew = a;
else lnew = (a - b) * (c - 2) + a + 1, rnew = (a - b) * (c - 1) + a;
if (check(l, r, lnew, rnew, false)) res = -1;
cout << res << ' ';
}
}
cout << '\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) solve();
return 0;
}
CF1810D Candies题解的更多相关文章
- ACM-ICPC 2018 焦作赛区网络预赛 Give Candies 题解
ACM-ICPC 2018 焦作赛区网络预赛 Give Candies n个糖果分给n个小朋友 从1到n个小朋友依次给,每次随机给个数,至少一个,知道没有糖果为止. 问糖果的分布情况方案数. 输出方案 ...
- CF753A Santa Claus and Candies 题解
Content 圣诞老人有 \(n\) 颗糖果,他想把这些糖果分发给一些小孩子,并想要每个孩子都能得到不同的糖果数目.求能得到糖果的孩子的最大数目,以及他们各自得到的糖果数. 数据范围:\(1\leq ...
- [题解]Mail.Ru Cup 2018 Round 1 - C. Candies Distribution
[题目] C. Candies Distribution [描述] n个小朋友排排坐吃糖糖,小朋友从左到右编号1到n.每个小朋友手上有一定数量的糖.对于第i个小朋友来说,编号比他小的小朋友中有li个小 ...
- ACM-ICPC 2018 焦作赛区网络预赛G Give Candies(隔板定理 + 小费马定理 + 大数取模,组合数求和)题解
题意:给你n个东西,叫你把n分成任意段,这样的分法有几种(例如3:1 1 1,1 2,2 1,3 :所以3共有4种),n最多有1e5位,答案取模p = 1e9+7 思路:就是往n个东西中间插任意个板子 ...
- POJ 3159 Candies(差分约束+最短路)题解
题意:给a b c要求,b拿的比a拿的多但是不超过c,问你所有人最多差多少 思路:在最短路专题应该能看出来是差分约束,条件是b - a <= c,也就是满足b <= a + c,和spfa ...
- POJ 2886 Who Gets the Most Candies? (线段树)题解
题意:一堆小朋友围成一个圈,规定从k开始玩,每个被选中的人都有一个数字,正数代表从他左边开始数num,负数从右边数,被选中的人继续按照上述操作,直到都退出圈子,第i个退圈的人能拿到一个点数,这个点数是 ...
- 【题解】CF991C Candies
题面传送门 解决思路 看到 \(10^{18}\) 的范围,我们可以想到二分答案.只要对于每一个二分出的答案进行 \(check\) ,如果可行就往比它小的半边找,不可行就往比它大的半边找. 以下是 ...
- POJ 3159 Candies (栈优化spfa)
Candies 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/J Description During the kinderga ...
- poj 3159 Candies
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 25776 Accepted: 7033 Descrip ...
- ACM-ICPC 2018 焦作赛区网络预赛 G Give Candies
There are NNN children in kindergarten. Miss Li bought them NNN candies. To make the process more in ...
随机推荐
- Laravel 代码开发最佳实践(持续更新)
我们这里要讨论的并不是 Laravel 版的 SOLID 原则(想要了解更多 SOLID 原则细节查看这篇文章)亦或是设计模式,而是 Laravel 实际开发中容易被忽略的最佳实践. 内容概览 单一职 ...
- 3. 面向对象编程(OOP):
面向对象编程的本质就是:以类的方式组织代码.以对象的组织(封装)数据 抽象:就是把不同的物品的共同点剥离出来,构成一个类.如每个人都有2条腿,我们可以把2条腿剥离出来 构成一个类 类与对象的关系 类: ...
- [C++核心编程] 4.3、类和对象-C++对象模型和this指针
文章目录 4.3 C++对象模型和this指针 4.3.1 成员变量和成员函数分开存储 4.3.2 this指针概念 4.3.3 空指针访问成员函数 4.3.4 const修饰成员函数 4.3 C++ ...
- Python Requets库学习总结
快速开始 发送请求 >>> import requests >>> r = requests.get('https://api.github.com/events' ...
- 使用GitHub当博客图床提升博客访问速度
前言 作为一个穷逼来说站长来说,只有一个1M宽带这样的小水管服务器,如果博客稍微放一点图片到本地,然后人多点访问网站基本就很卡了,但又不想去吧图片放到图床里然后复制链接到文章里面那么麻烦 如何解决这个 ...
- Golang常用语法糖
1.名字由来 语法糖(Syntactic sugar)的概念是由英国计算机科学家彼得·兰丁提出的,用于表示编程语言中的某种类型的语法,这些语法不会影响功能,但使用起来却很方便.语法糖,也称糖语法,这些 ...
- Python NumPy 广播(Broadcast)
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b 形状相同,即满足 a.shape == ...
- 2022-02-09:k8s安装redis,yaml如何写?
2022-02-09:k8s安装redis,yaml如何写? 答案2022-02-29: apiVersion: apps/v1 kind: Deployment metadata: labels: ...
- 2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr,每个值表示 居民点的一维坐标,再给定一个正数 num,表示邮局数量。选择num个居民点建立num个 邮局,使
2021-04-30:一条直线上有居民点,邮局只能建在居民点上.给定一个有序正数数组arr,每个值表示 居民点的一维坐标,再给定一个正数 num,表示邮局数量.选择num个居民点建立num个 邮局,使 ...
- Django4全栈进阶之路16 项目实战(用户管理):user_list.html用户列表画面设计
首先在template模板文件夹中新建account子文件夹,用于存放用户管理相关模块页面. 下面开始正式的设计: 1.模块代码设计 {% extends 'base.html' %} {% bloc ...


