#P14762. [Opoi 2025] CCD 的长恨歌

    ID: 16230 远端评测题 1000ms 512MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>交互题Special JudgeO2优化树链剖分

[Opoi 2025] CCD 的长恨歌

题目背景

前几天 一年前 CCD 因为模拟赛挂分而被 _Eriri_ 嘲讽,于是他准备出一道题来嘲讽 _Eriri_。

栋皇重色思倾国,御宇多年求不得。

蒋家有女初长成,养在深闺人未识。

天生丽质难自弃,一朝选在君王侧。

回眸一笑百媚生,六宫粉黛无颜色。

[upd 2025/5/5]. <- 链接赛前一天被 _Eriri_ 删除……

题目描述

请注意,此题仅支持 C++11 及以上提交!

栋明皇有一棵非常神秘的有 nn 个点的有根树 TT,根为 11

而你,作为尊贵的蒋贵妃,非常想知道树 TT 的形态,但你每次只能向栋明皇问一个二元组 (i,j) (1i,jn)(i,j)\ (1 \le i , j \le n),栋明皇会告诉你这两个点在树上的最近公共祖先 kk。由于栋明皇还要忙着筹备 Opoi,他只允许你向他问 n×300n \times 300 次问题。

幸运的是,栋明皇喜欢紧凑的结构,所以这颗树的叶子个数至多为 2020

本题是一道交互题。

提交时,请在程序中加入以下函数声明语句:

int LCA(int,int);

这使你可以调用 LCA(x,y) 并得到它们的 LCA。

你不需要,也不应该实现主函数,你只需要实现下列函数:

vector<pair<int, int> > guess(int n);
  • 每个测试点交互库只会调用一次该函数。
  • 其中 nn 表示本次猜测的树 TT 的结点个数。
  • 返回的 vector 描述了树 TT 的结构,其中 vector 的每一个 pair<int, int> 表示树的一条边 (u,v)(u,v),每条边两个节点的顺序和边与边之间的顺序没有要求。
  • 单次 LCA(x, y) 复杂度是严格 O(1)O(1) 的,交互库预处理复杂度 O(nlog2n)O(n \log_2 n)
  • SPJ 不会因你 LCA 的调用次数过多返回 WA,但如果超过了 n×300n \times 300 次,那么后面的 LCA 调用结果都是 -1

题目附件里有一个示范模板 template.cpp,使用它你可以获得 00 分的好成绩。

2
1 2

提示

样例解释

You Interactor
LCA(1,2) 1
1 2 Accepted

除了样例输出,输出 2 1 也是一个合法的解。


数据范围与约定

对于 100%100\% 的数据,1n2×1041 \le n \le 2 \times 10^4

部分分:数据共有 2020 组,对于第 ii 组数据,保证树的叶子个数至多为 ii


提示

如果你不知道怎么解决交互题,可以参考这题

本题模板程序与模板交互库见附件中的 template.cpps_interactor.cpp