当前没有测试数据。
题目描述
这是一道交互题,请引用:
#include "ds.h"
你会收到两个整数 n,q,以及 q 个区间
[l1,r1],[l2,r2],…,[lq,rq].
保证
1≤li≤ri≤n,
且每个二元组 (li,ri) 都是在所有满足 1≤l≤r≤n 的二元组中随机生成的。
你需要维护一个集合
S⊆{1,2,…,n},
初始时 S=∅。你可以使用下面五种操作。
void add(int x);
向 S 中添加整数 x。你必须保证
1≤x≤n,x∈/S.
void del(int x);
从 S 中删除整数 x。你必须保证
1≤x≤n,x∈S.
void revoke();
设最近一次被加入 S,且尚未被删除或撤销的元素为 x,则将 x 从 S 中删除。你必须保证存在这样的元素。
void clear();
清空 S,即令
S=∅.
void report(int k);
向交互库报告已经形成了第 k 个区间。调用时必须恰好满足
S={lk,lk+1,…,rk}.
当所有区间均被恰好报告一次时,视为完成任务。
实现方式
你需要实现下面的函数:
void solve(
int n,
int q,
vector<int> l,
vector<int> r
);
数组 l 和 r 的下标范围均为 0 到 q−1。
子任务与评分
设 C1,C2,C3,C4,C5 分别表示 add、del、revoke、clear、report 五种操作的调用次数。
你必须保证:
C4≤n,C5=q.
| 子任务编号 |
分值 |
n≤ |
q≤ |
C1≤ |
C2≤ |
C3≤ |
| 1 |
10 |
1000 |
106 |
0 |
0 |
| 2 |
20 |
5×104 |
105 |
35000000 |
35000000 |
| 3 |
0 |
35000000 |
| 4 |
50 |
6×107 |
0 |
对于前三个子任务,只要对应操作次数均不超过限制,即可获得该子任务满分;否则该子任务得 0 分。
对于子任务 4:
- 若 C1≤30000000,获得该子任务满分,即 50 分;
- 若 30000000<C1≤60000000,获得的分数为
$$\left\lfloor
50\times\left(1-\frac{C_1-30000000}{30000000}\right)
\right\rfloor;$$
- 若 C1>60000000,或不满足其他限制条件,则获得 0 分。