[Codeforces is All You Need] ER 145 E (1809E) - Explanation
阅读jiangly代码有感,觉得思路很有趣,具体代码各位可自行去codeforces欣赏。这里我不会给出详细的证明,仅作直观解释。
题目简述
有两个容量分别为的桶。给定一个长为
的按顺序进行的操作序列,每个元素表示从一号桶向二号或者从二号桶向一号桶倒指定水量
。当然,操作需要符合常理,因此实际转移的水量为
,其中
表示目标桶的剩余可接纳量,
表示源桶的剩余水量。对于
,计算当初始水量为
时最终的水量。
原题目链接为:https://codeforces.com/contest/1809/problem/E
解释
将一号桶的水量看作状态。在总水量一定的前提下,一号桶的水量一定位于
之间,可视化为:

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

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

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

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