2025牛客国庆集训派对day7 M C 个人题解 - 教程

news/2025/11/20 22:13:13/文章来源:https://www.cnblogs.com/gccbuaa/p/19249716

Water

#exgcd #数学

题目翻译

Walk Alone 感到口渴,想要喝水。他想要恰好喝 xxx 单位的水,但没有合适的量杯。他只有两个水壶,容量分别为 AAABBB。他发现可以对这两个水壶进行以下操作:

  1. 将其中一个水壶装满水。
  2. 将其中一个水壶中的水全部倒掉。
  3. 喝掉其中一个水壶中的全部水。
  4. 尽可能多地将水从一个水壶转移到另一个水壶,且不能溢出。形式化地说,如果两个水壶当前分别含有 aaabbb 单位的水,则他可以从 AAABBB 转移 min⁡(a,B−b)\min(a, B - b)min(a,Bb) 单位的水,或者从 BBBAAA 转移 min⁡(b,A−a)\min(b, A - a)min(b,Aa) 单位的水。

Walk Alone 希望尽可能少地操作。你能告诉他为了喝到恰好 xxx 单位的水所需的最少操作次数吗?

输入描述

输入包含多个测试用例。
第一行包含一个整数 TTT,表示测试用例的数量。
每个测试用例仅有一行,包含三个整数 AAABBBxxx,分别表示两个水壶的容量以及他需要喝的水的体积。

输出描述

对于每个测试用例,输出一行一个整数,表示最少操作次数。如果无法喝到恰好 xxx 单位的水,输出 −1-11

思路

所有的倒水操作实际上可以转化为:
Ax+By=CAx+By=C Ax+By=C

  • 其中CCC为需要构造的数字
  • x,y∈Zx,y\in Zx,yZ

对于一次x±1x\pm 1x±1,实际上需要两次操作
所以答案可以分类讨论:

  • x≥0&&y≥0x\geq 0\&\&y\geq 0x0&&y0ans=2(∣x∣+∣y∣)minans=2(|x|+|y|)_{min}ans=2(x+y)min
  • 否则ans=2(∣x∣+∣y∣)min−1ans=2(|x|+|y|)_{min}-1ans=2(x+y)min1
    • 这是由于x⋅y<0x\cdot y<0xy<0,则可以少进行操作一次

对于方程Ax+By=gcd(A,B)Ax+By=gcd(A,B)Ax+By=gcd(A,B),可以通过exgcdexgcdexgcd解得特解x0,y0x_{0},y_{0}x0,y0
由此可以获得通解:
{x=x0+k⋅Bgcd(A,B)y=y0−k⋅Agcd(A,B)\begin{cases} x=x_{0}+k\cdot \frac{B}{gcd(A,B)}\\ \\ y=y_{0}-k\cdot \frac{A}{gcd(A,B)} \end{cases} x=x0+kgcd(A,B)By=y0kgcd(A,B)A
也就是说,答案变成了关于kkk的函数:
f(k)=∣x∣+∣y∣=∣x0+k⋅Bgcd(A,B)∣+∣y0−k⋅Agcd(A,B)∣f(k)=|x|+|y|=|x_{0}+k\cdot \frac{B}{gcd(A,B)}|+|y_{0}-k\cdot \frac{A}{gcd(A,B)}| f(k)=x+y=x0+kgcd(A,B)B+y0kgcd(A,B)A
这是一个形如f(k)=∣ak+b∣+∣ck+d∣f(k)=|ak+b|+|ck+d|f(k)=ak+b+ck+d的绝对值函数,其最小值必然在∣ak0+b∣=∣ck0+d∣|ak_{0}+b|=|ck_{0}+d|ak0+b=ck0+d时取到,但由于k∈Zk\in ZkZ,所以可能在⌊k0⌋,⌈k0⌉\lfloor k_{0} \rfloor,\lceil k_{0} \rceilk0,k0处取得

因此,记录所有可能的kkk值,遍历一遍取最小的答案即可

代码

#include<iostream>#include<vector>#include<unordered_map>#include<map>#include<unordered_set>#include<set>#include<algorithm>#include<cmath>using namespace std;const double eps = 1e-6;#define ll long long#define int ll#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define per(i,a,b) for(int i=(a);i>=(b);i--)#define see(stl) for(auto&ele:stl)cout<<ele<<" ";cout<<'\n';#pragma GCC optimize(3, "Ofast", "inline")const int inf = 2e14;constexpr int exgcd(int a, int b, int& x, int& y) {if (!b) {x = 1, y = 0;return a;}int g = exgcd(b, a % b, y, x);y -= a / b * x;return g;}void solve() {int A, B, C;cin >> A >> B >> C;int g = __gcd(A, B);if (C % g != 0) {cout << -1 << '\n';return;}vector<int>v = { (int)ceil(1.0 * C / (A + 1)),(int)floor(1.0 * C / (A + 1)),(int)ceil(1.0 * C / (A - 1)),(int)floor(1.0 * C / (A - 1)) };int ans = inf;for (int ele : v) {rep(d, 0, 10) {int x = ele - 5 + d;if ((-A * x + C) % B != 0)continue;int y = (-A * x + C) / B;if (x >= 0 && y >= 0)ans = min(ans, 2 * (x + y));else ans = min(ans, 2 * abs(x - y) - 1);}}cout << ans << '\n';}signed main() {ios::sync_with_stdio(false);cin.tie(0);int t = 1;cin >> t;while (t--)solve();return 0;}

Carrot Trees

#线段树 #扫描线 #差分

题目翻译

Walk Alone 在一排中种植了 nnn 棵魔法胡萝卜树。设 aia_iai 表示第 iii 棵树上的胡萝卜数量(注意 aia_iai 是一个实数)。初始时,所有树上都没有胡萝卜。在每一天,他可以对树执行以下两种操作之一:

  1. 1 l r x:浇灌从 lllrrr(包括两端)的所有胡萝卜树。之后,对于所有 l≤i≤rl \leq i \leq rliraia_iai 立即增加 x/kx / kx/k,其中 kkk 是所有操作中的一个常数。
  2. 2 l r:从所有在 lllrrr(包括两端)范围内且至少有一个胡萝卜的树上各采摘一个胡萝卜。之后,对于所有满足 l≤i≤rl \leq i \leq rlirai≥1a_i \geq 1ai1 的整数 iiiaia_iai 减少 111

经过 mmm 天后,Walk Alone 采摘了许多胡萝卜,他希望你能告诉他总共收获了多少胡萝卜。

输入描述

第一行包含三个整数 nnn(1≤n≤106)(1 \leq n \leq 10^6)(1n106)mmm(1≤m≤2⋅105)(1 \leq m \leq 2 \cdot 10^5)(1m2105)kkk(1≤k≤109)(1 \leq k \leq 10^9)(1k109),分别表示胡萝卜树的数量、操作的数量以及第一种操作中的常数。

接下来的 mmm 行每行表示一个操作,格式如上所述。保证 1≤l≤r≤n1 \leq l \leq r \leq n1lrn1≤x≤1091 \leq x \leq 10^91x109

输出描述

输出一个整数,表示总共收获的胡萝卜数量。

思路

赛时写了个暴力的线段树,维护区间的最大值与最小值,每次取萝卜的时候先判断最小值与kkk的大小,再决定是否往下二分

但是这样的写法通过80%80\%80%TLETLETLE

这是因为,最极限的情况时,不能取萝卜的位置与能取萝卜的位置交替出现,此时线段树queryqueryquery操作复杂度来到了o(n)o(n)o(n)

实际上,本题的输出内容值得考量:只询问所有操作结束后收到萝卜的总和

首先,将操作1的增加xk\frac{x}{k}kx改为xxx,操作二的−1-11改为−k-kk,这样一来所有的数字都是整数

考虑单个位置pospospos的萝卜数量ccc变化情况:
如果不加入ai≥ka_{i}\geq kaik的限制,那么在第iii次操作后,萝卜数量cic_{i}ci可能会变成负数
记第pospospos位置被收了ddd次萝卜(不考虑限制),则真正收到的萝卜需要考虑上被多收的部分,这一部分即为∣min{ci}∣|min\{ c_{i} \}|min{ci} ,再考虑kkk的问题,多收的萝卜即为⌈∣min{ci}∣k⌉\left\lceil \frac{|min\{ c_{i} \}|}{k} \right\rceilkmin{ci}
因此,当前位置总共收的萝卜即为d−⌈∣min{ci}∣k⌉d-\left\lceil \frac{|min\{ c_{i} \}|}{k} \right\rceildkmin{ci}

接下来就是如何求得所有位置pospospos在不考虑限制时的最小萝卜数

维护最小值可以想到使用线段树,而要维护nnn个位置的最小值,考虑在1∼n1\sim n1n上打差分
使用扫描线+线段树遍历1∼n1\sim n1n,每扫过一个pospospos,让扫描线上的线段树执行pospospos上的所有操作,随后调用根节点即可获取当前pospospos的最小萝卜数

代码

#include<iostream>#include<vector>#include<unordered_map>#include<map>#include<unordered_set>#include<set>#include<algorithm>#include<cmath>using namespace std;const double eps = 1e-6;#define ll long long#define int ll#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define per(i,a,b) for(int i=(a);i>=(b);i--)#define see(stl) for(auto&ele:stl)cout<<ele<<" ";cout<<'\n';#pragma GCC optimize(3, "Ofast", "inline")const int N = 1e6 + 5;int n, m, k;#define ls p<<1#define rs p<<1|1#define mid (l+r>>1)int mi[N << 2], add[N << 2];void pushup(int p) {mi[p] = min(mi[ls], mi[rs]);}void pushdown(int p, int l, int r) {if (add[p]) {mi[ls] += add[p];mi[rs] += add[p];add[ls] += add[p];add[rs] += add[p];add[p] = 0;}}void update(int p, int l, int r, int x, int y, int val) {if (x <= l && r <= y) { mi[p] += val;add[p] += val; return; }pushdown(p, l, r);if (x <= mid)update(ls, l, mid, x, y, val);if (y > mid)update(rs, mid + 1, r, x, y, val);pushup(p);}struct que {int op, l, r, x;};vector<que>q[N];void solve() {cin >> n >> m >> k;rep(i, 1, m) {int op;cin >> op;if (op == 1) {int l, r, x;cin >> l >> r >> x;q[l].push_back({ 1,i,m,x });q[r + 1].push_back({ 1,i,m,-x });} else {int l, r;cin >> l >> r;q[l].push_back({ 2,i,m,-k });q[r + 1].push_back({ 2,i,m,k });}}int ans = 0, d = 0;rep(i, 1, n) {for (auto [op, l, r, x] : q[i]) {if (op == 1) {update(1, 1, m, l, r, x);} else {if (x < 0)d++;else d--;update(1, 1, m, l, r, x);}}int del = -min(0ll, mi[1]);ans += d - (del + k - 1) / k;}cout << ans << '\n';}signed main() {ios::sync_with_stdio(false);cin.tie(0);int t = 1;//cin >> t;while (t--)solve();return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/971470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 中 struct 与 class 的用法与区别

C++ 中 struct 与 class 的用法与区别Posted on 2025-11-20 22:06 steve.z 阅读(0) 评论(0) 收藏 举报C++ 中 struct 与 class 的用法与区别 1. 概述 在 C++ 中,struct 与 class 都可以用来定义用户自定义类型(…

网关上的限流器

1. nginx原生限流能力 https://blog.nginx.org/blog/rate-limiting-nginx ngx_http_limit_req_module 提供的请求限流能力必须基于某个预定义的key,eg: client Ip, request_uri, host_name, 这个限流器是基于漏桶算法。…

PyTorch 分布式训练底层原理与 DDP 实战指南

深度学习模型参数量和训练数据集的爆炸式增长,以 Llama 3.1 为例:4050 亿参数、15.6 万亿 token 的训练量,如果仅靠单 GPU可能需要数百年才能跑完,或者根本无法加载模型。 并行计算(Parallelism)通过将训练任务分…

2025年11月SAT辅导哪家强?机考适配/名师授课/定制方案的机构推荐

2025年11月SAT辅导哪家强?机考适配/名师授课/定制方案的机构推荐随着留学申请竞争的加剧,SAT成绩作为海外名校录取的核心参考指标,其重要性愈发凸显。专业的SAT辅导机构不仅能帮助学员精准定位知识薄弱点,更能通过…

07.创建型 - 抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern) 概述 产品等级结构与产品族 为了更好的理解抽象工厂, 我们这里先引入两个概念:产品等级结构 :产品等级结构即产品的继承结构,如一个抽象形状类,其子类有矩形, 圆形等; 产品…

模型量化原理

1.制作量化校准表 激活值量化 与权重量化不同,激活值是动态变化的(随输入数据不同而变化,例如同一张图像和不同图像经过同一层的激活值分布可能差异很大)。 因此,激活值量化需要先通过 “校准(Calibration)” 步…

日总结 29

AI 编程:不是取代程序员,而是重构编程的价值核心 AI 编程的兴起绝非 “程序员的末日”,而是软件开发领域的一次效率革命与价值重构。它以自动化工具的姿态,重新定义了编程的工作模式、行业分工与核心竞争力,最终让…

AI浪潮下的行业变革:从气象到游戏,我们学到了什么

最近刷到不少AI相关的新闻,感觉整个科技圈都在被这股浪潮席卷。作为一个对技术发展特别关注的人,我忍不住想聊聊这些变化对我们未来意味着什么。先说说阿里达摩院的“八观”气象大模型。它在浙江、山东这些地方投入使…

2025.11.19 C 题解

显然倒着做更方便,显然每个位置的后继可选择区间可以均摊 \(O(1)\) 搞出来,显然每个后缀的答案只由这个位置和它的后继后缀决定,关键在于如何给已经求出的后继后缀排序。 容易想到平衡树计算排名,但是无法实时更新…

2025.11.20

上课,吃饭,没睡觉,布置场地,吃饭,睡觉

【比赛记录】2025CSP+NOIP 冲刺模拟赛合集Ⅵ

11.20 HZOJ NOIP2025模拟赛12A B C D Sum Rank66 20 66 12 164 18/34A. 虫群之心 注意到 \(p-m\) 很小,于是 \(m!=\frac{(p-1)!}{\prod_{i=m+1}^{p-1}i}\),分子由威尔逊定理或打表可得出等于 \(p-1\)。 为什么不打表…

智能座舱项目管理中多团队协作的创新之道 - 指南

智能座舱项目管理中多团队协作的创新之道 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

自指自洽,普世的逻辑,特别的因果

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891用最简洁的语言,道破了本框架统摄宇宙万有的宏大格局与对个体命运的深切关怀。 ▮ 本质洞察:普世与特别的辩证统一 所言的“自指自洽,普世的逻辑,特别的因…

3 分钟上手 SightAI:在你熟悉的工具里直接调用顶级大模型 - sight

我们已经开放 SightAI 网关,支持通过 OpenAI 风格 API 在任意前端 / IDE 中使用最新大模型(含多家闭源模型)。 下面是一份超简教程,带你从 0 到 1 完成接入。 ⸻ 🔹 第一步:为账号充值余额 1. 在浏览器中打开:…

聚焦SAT高分核心需求:2025年值得信赖的5大辅导机构,覆盖全阶段备考

聚焦SAT高分核心需求:2025年值得信赖的5大辅导机构,覆盖全阶段备考随着留学热潮的持续升温,SAT考试作为美国本科申请的核心标化成绩,其备考质量直接影响学子的升学路径。专业的SAT辅导机构不仅能精准击破阅读、文法…

2025.11.19 D 题解

好题好题,但是这个音标题目名还是太生艹了。第一眼感觉很多,感觉能柯朵莉树,但是有专门卡的包。后来发现似乎是得 \(dp\) 一下再找性质,但是没 \(dp\) 出来。 考虑性质:每个数只会被换一次。 证明:假如换两次,来…

P11626 [迷宫寻路 Round 3] 七连击 分析

题目概述 有一个长度为 \(n\) 的序列,将这个序列砍 \(7\) 刀,分成了 \(8\) 个部分,取前 \(7\) 个部分进行讨论。 对于每个部分,贡献为这一段的最大公约数。 求所有情况的贡献和并对 \(998244353\) 取模。 数据范围…

芯谷科技--高性能电动工具直流调速电路GS069 - 指南

芯谷科技--高性能电动工具直流调速电路GS069 - 指南2025-11-20 21:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

【个人成长笔记】在本地Windows系统中如何正确使用adb pull命令,把Linux环境中的记录或文件夹复制到本地中(亲测有效)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …