P8262 [CTS2022] WBTT
题目背景
**这是一道交互题。**
#### 本地测试需 #include
#### 提交时请采用以下模板,而不 include long.h,具体方法就是直接把这个模板放在自己代码里面,然后需要完善题目中要求的函数。
```cpp
struct sethash{
int val;
void encode();
void decode();
void operator=(int x);
};
struct infoset{
sethash sum;
int sz;
int size()const{
return sz;
}
};
extern const infoset emptyset;
infoset merge(const infoset&a,const infoset&b);
void report(infoset p);
void init(int id,int n,int q,vectordad,vectorve);
void modify(int x,int y);
void ask(int x,int y);
```
***
伟大的科学家欣准备建造强人工智能隆统治世界。在输入一些越南的算法竞赛题作为训练集后,她发现隆自动生成了一个新的问题,并给出了一份解答。同时隆还将测试集中30%的输入数据归约到了这个问题。
欣连忙将这个问题抄录如下:
给定一棵有根树,你需要支持两种操作
* 查询树链元素和
* 将一个点的父亲改成另一个点
“这个问题并不强啊,为什么能解决测试集中30%的问题呢?”欣心里想。
在关闭训练结果页面前,欣突然发现,隆给出的这个问题中,信息合并的代价并不是 $O(1)$ 的。
欣陷入了沉思,发现自己并不会这道题。
为了知道这题有多难,欣将这题放到了您的面前。
题目描述
你需要维护一棵以 $1$ 为根的有根树。这棵树有 $n$ 个点。初始时对于所有 $2 \le i \le n$,点 $i$ 有个父亲 $p_i$,保证 $p_i \lt i$。
一开始你有 $n$ 个集合 $\{1\},\{2\},\cdots,\{n\} $。对于任意两个集合 $A$ 和 $B$,如果 $A \cap B=\empty$,那么你可以通过一次操作,消耗 $|A|+|B|$ 的代价,获得集合 $A \cup B$。
之后有 $q$ 次操作。每次操作有两种类型
* `0 a b` 记树上 $a$ 到 $b$ 之间的路径上的点构成的点集为 $S$。你需要将 $S$ 表示为 $\cup_{i=1}^{k}A_i$,需要满足 $A_i$ 是你已经获得的集合,且 $\forall i \neq j,A_i \cap A_j=\empty$。用 $(A_1,A_2,\cdots,A_k) $ 回答一次询问的代价为 $k$。
* `1 a b` 表示将点 $a$ 的父亲改为 $b$,保证 $a \gt 1$,且修改后这 $n$ 个点仍构成一棵树,但**不保证 $a \gt b$ ** 。你可以在这次操作中新生成一些集合用以应对之后的询问。
记你整个程序运行过程中消耗的总代价为 $C_1$,单次操作消耗代价最大值为 $C_2$。每个子任务会根据 $C_1,C_2$ 的大小按照一定方式给分。
输入格式
无
输出格式
无
说明/提示
### 评分方式
**本题首先会受到和传统题相同的限制**。例如编译错误会导致整道题目得 $0$ 分,运行时错误、超过时间限制、超过空间限制等会导致相应测试点得 $0$ 分等。你只能访问自己定义的和交互库给出的变量及其对应的内存空间,尝试访问其他空间将可能导致编译错误或运行错误。
在上述条件基础上,在一个测试点中,若程序执行了非法的函数调用、没有正常结束运行或询问操作给出了错误回答,该测试点将会获得 $0$ 分。否则,将根据你程序消耗的代价,有两种评分方式:
* 评测方式一:若 $W_1 \gt 6 \cdot 10^8$,则该测试点得 $0$ 分;否则该测试点得分为 $\frac{\frac{1.5 \cdot 10^8}{max(W_1,1.5 \cdot 10^8)} \cdot 7+3}{10} \times 该测试点所属子任务分值 $
* 评测方式二:若 $W_2 \gt 2 \cdot 10^4$,则该测试点得 $0$ 分;否则该测试点得分为 $\frac{5000}{max(W_2,5000)} \times 该测试点所属子任务分值$
不同的子任务会使用不同的评测方式。一个子任务的得分为其中所有测试点得分的最小值。
### 限制与约定
保证对于所有测试点均有 $1 \le n,q \le 10^5$。
| 子任务编号 | $n,q \le$ | 特殊性质 | 评测方式 | 分值 |
| ---------- | --------- | -------- | -------- | ---- |
| $1$ | $100$ | 无 | 一 | $10$ |
| $2$ | $10^5$ | 有 | 一 | $20$ |
| $3$ | $10^5$ | 有 | 二 | $20$ |
| $4$ | $10^5$ | 无 | 一 | $30$ |
| $5$ | $10^5$ | 无 | 二 | $20$ |
特殊性质:保证每个时刻除了 $1$ 号节点外每个节点至多只有一个儿子。
### 后记
欣发现您五个小时还是没有做出本题,对隆的能力感到非常满意。然而第二天早上起来后,欣突然发现隆做法的复杂度证明是错的。