Bananas in a Microwave | Codeforces 1498D
有一个变量 \(k\) 初始为 \(0\)。
对于时刻 \(i=1,2,3,\cdots,n\),给定 \(t_i,x_i,y_i\),且执行以下操作:
- 若 \(t_i=1\),选择 \(a \in [0,y_i]\),执行 \(a\) 次 \(k=\lceil k + x_i \rceil\)。
- 若 \(t_i=2\),选择 \(a \in [0,y_i]\),执行 \(a\) 次 \(k=\lceil k \cdot x_i \rceil\)。
其中 \(x_i\) 是实数。
对于每个 \(j \in [1,m]\),求可能的最小时刻使得 \(k=j\)。
\(n \le 200,y_i \le m \le 10^5\)
对于 \(t_i=1\),有 \(0 < x_i \le m\),对于 \(t_i=2\),有 \(1 < x_i \le m\)。
对于每个时刻 \(i\),维护数组 \(ok_j\) 表示经过前 \(i\) 个时刻能否使 \(k=j\)。
设 \(next_j=\begin{cases}\lceil j + x_i \rceil&(t_i=1)\\\\\lceil j \cdot x_i \rceil&(t_i=2)\end{cases}\)。
因为 \(\forall j \ne k,next_j \ne next_k\),所以 \(j \rightarrow next_j\) 连边后形成若干条链。
假设一条链上的结点分别为 \(v_1,v_2,v_3,\cdots,v_s\)
对于 \(v_j\),如果 \(\exist k \in [j-y_i,j)\),满足 \(ok_k=1\),那么在第 \(i\) 时刻 \(k\) 可以等于 \(v_j\)。
对每条链扫描一遍即可求出在第 \(i\) 时刻 \(k\) 可以等于哪些值。
复杂度 \(O(nm)\)。
代码:
1 |
|