欢迎光临散文网 会员登陆 & 注册

[Codeforces is All You Need] ER 145 E (1809E) - Explanation

2023-03-24 12:26 作者:故寓诸无竟  | 我要投稿

        阅读jiangly代码有感,觉得思路很有趣,具体代码各位可自行去codeforces欣赏。这里我不会给出详细的证明,仅作直观解释。

题目简述

        有两个容量分别为a%2Cb的桶。给定一个长为n的按顺序进行的操作序列,每个元素表示从一号桶向二号或者从二号桶向一号桶倒指定水量%7Cv_i%7C。当然,操作需要符合常理,因此实际转移的水量为%5Cmin%20%5C%7B%7Cv_i%7C%2Cx_i%2C%20y_i%5C%7D,其中x_i表示目标桶的剩余可接纳量,y_i表示源桶的剩余水量。对于0%5Cle%20c%5Cle%20a%2C0%5Cle%20d%5Cle%20b,计算当初始水量为c%2Cd时最终的水量。

        原题目链接为:https://codeforces.com/contest/1809/problem/E

解释

        将一号桶的水量看作状态。在总水量s一定的前提下,一号桶的水量一定位于%5Cmax%5C%7B0%2C%20s-b%5C%7D%2C%5Cmin%5C%7Ba%2Cs%5C%7D之间,可视化为:

水量上下界

        整个完整的转移序列对应着在上下界之间“回荡”的折线,如下:

一种转移序列

        考虑从左到右(蓝色线之间)以及从右到左(橙色线之间)所有转移的情况,分别可以划定出不同的折线带:

        观察图中的橙色带和蓝色带的交集(黄色部分)。这一部分不会受到上下界的限制。而对于交集带之外的任意路径,最终一定收束于交集带的对应边界(红线和紫线):

交集带之外的路径

        因此,只需要对全值域进行一次逆向映射求得定义域处交集带的范围,并基于这个范围正向映射求得对应的值域,即可判断任意初态最终的落点。

[Codeforces is All You Need] ER 145 E (1809E) - Explanation的评论 (共 条)

分享到微博请遵守国家法律