U705696 Tibo 又刷新 Codex 额度了
题目背景
自从 Codex 推出了新的额度策略后,hekuo 便开始一边开发项目,一边和额度斗智斗勇。
旧版账号同时受到 5 小时额度 与 周额度 的限制;而新版账号则取消了 5 小时额度,仅保留周额度。
更离谱的是,OpenAI 员工 Tibo 经常会突然给部分用户刷新周额度,因此社区里流传着一句话:
> Tibo 又刷新 Codex 额度了。
与此同时,部分 K12 账号始终停留在旧版规则,从头到尾都不会切换到新版。
为了按时完成项目,hekuo 可以等待 Tibo 的官方刷新,也可以主动使用重置卡恢复周额度。但如果额度不足,项目就会被迫中断,而每一次新的中断都会让项目变得更加难以完成。
现在,请你帮助 hekuo 合理规划重置卡的使用方案,在规定时间内完成所有项目。
题目描述
时间以小时为单位,共有 T 个小时,编号为 0 ~ T−1。
共有 n 个项目,第 i 个项目具有三个属性:
启动时刻 s_i
初始工作量 a_i
每小时最大处理量 r_i
从 s_i 开始,只要项目尚未完成,它就会尝试运行。
若项目能够运行,则每小时最多完成 r_i 单位工作量;如果剩余工作量不足 r_i,则仅完成剩余部分。
每完成 1 单位工作量,就会消耗 1 点 Codex 额度。
多个项目可以同时运行,因此一个小时内的额度消耗等于所有正在运行项目消耗之和。
旧版额度规则
账号初始采用旧版额度规则,同时受到两种限制:
任意连续 5 个小时内消耗的额度总和不能超过 H;
自最近一次周额度刷新以来,累计消耗的额度不能超过 W。
只要任意一项限制被突破,本小时所有准备运行的项目都会无法运行。
新版额度规则
系统可能会在某一个时刻执行一次 SWITCH 指令。
执行后:
永久取消 5 小时额度限制;
仅保留周额度限制;
已经消耗的周额度不会恢复;
正在运行的项目不会停止。
如果输入中不存在 SWITCH,则表示这是一个 K12 账号,整个过程中始终采用旧版额度规则。
### 官方刷新与重置卡
Tibo 会在若干给定时刻进行官方刷新。
官方刷新会立即:
- 将当前周额度使用量清零;
- 恢复完整周额度 `W`;
- 清除最近 5 小时内的额度消耗记录,使 5 小时额度恢复。
除此之外,hekuo 拥有 `k` 张重置卡。
第 `i` 张重置卡具有:
- 获得时间 `c_i`;
- 过期时间 `e_i`。
只有满足:`c_i ≤ 当前时间 ≤ e_i`
时,该重置卡才能被使用。
每张重置卡最多使用一次。
使用一张重置卡后,会立即:
- 将当前周额度使用量清零;
- 恢复完整周额度 `W`;
- 清除最近 5 小时内的额度消耗记录,使 5 小时额度恢复。
如果一张重置卡在过期前没有使用,则该卡失效。
hekuo 需要合理安排重置卡的使用时间,使所有项目能够按时完成。
### 每小时执行顺序
对于每一个小时,按照如下顺序执行:
1. 如果本小时存在官方刷新,则恢复周额度;
2. 如果本小时存在 `SWITCH`,则立即切换到新版规则;
3. hekuo 可以选择是否使用一张重置卡,同时恢复周额度和 5 小时额度;
4. 判断所有项目是否能够同时运行;
5. 若能够运行,则扣除额度并完成对应工作量;
6. 若不能运行,则所有准备运行的项目进入或保持中断状态。
同一个小时最多使用一张重置卡。
输入格式
第一行包含六个整数:
```
n H W T m k
```
其中:
- `n` 表示项目数量;
- `H` 表示 5 小时额度上限;
- `W` 表示周额度上限;
- `T` 表示总运行时间;
- `m` 表示官方刷新次数;
- `k` 表示重置卡数量。
---
接下来 `n` 行,每行包含三个整数:
```
s_i a_i r_i
```
表示第 `i` 个项目:
- `s_i`:启动时间;
- `a_i`:初始工作量;
- `r_i`:每小时最大处理量。
---
接下来一行包含 `m` 个整数:
```
f_1 f_2 ... f_m
```
表示官方刷新时刻。
---
接下来 `k` 行,每行包含两个整数:
```
c_i e_i
```
表示第 `i` 张重置卡:
- `c_i`:该卡可开始使用的时间;
- `e_i`:该卡过期时间。
若当前时间不满足:
```
c_i ≤ t ≤ e_i
```
则该卡不能使用。
---
最后一行包含一个整数:
```
q
```
表示 `SWITCH` 指令时间。
- `q = -1` 表示不存在 `SWITCH`;
- 否则表示第 `q` 小时执行 `SWITCH`。
输出格式
输出一个整数:
- 表示完成所有项目所需要使用的最少重置卡数量。
如果无论如何都无法完成所有项目,输出:
```
-1
```
说明/提示
* 官方刷新只恢复周额度,不会清除 5 小时额度记录。
* 重置卡会恢复周额度,并清除全部 5 小时额度记录。
* `SWITCH` 本身不会恢复任何额度。
* 切换到新版规则后,不再计算 5 小时额度。
* 在同一个小时使用重置卡后,项目可以立即使用恢复后的额度运行。
### 样例1说明
hekuo 有两个项目:
* 项目 1:
* 第 0 小时启动;
* 初始工作量为 20;
* 每小时最多处理 5。
* 项目 2:
* 第 0 小时启动;
* 初始工作量为 10;
* 每小时最多处理 5。
账号初始采用旧版额度规则:
* 5 小时额度上限为 15;
* 周额度上限为 30。
第 0 小时:
两个项目同时运行:
* 项目 1 消耗 5 点额度;
* 项目 2 消耗 5 点额度。
共消耗 10 点额度。
第 1 小时:
两个项目继续运行,需要再次消耗 10 点额度。
此时最近 5 小时累计消耗:
```
10 + 10 = 20
```
超过 5 小时额度上限 15。
因此两个项目进入中断状态。
hekuo 有两张重置卡:
* 第 1 张可在第 1 至第 3 小时使用;
* 第 2 张可在第 5 至第 7 小时使用。
如果等待第 4 小时的官方刷新,虽然额度会恢复,但剩余时间不足以保证所有项目完成。
因此 hekuo 应该在第 1 小时使用第 1 张重置卡:
* 周额度恢复;
* 5 小时额度恢复;
* 两个项目继续运行。
最终只需要使用 1 张重置卡即可完成所有项目。
因此答案为:
```
1
```