#P1797. 【模板】Stern-Brocot 树

【模板】Stern-Brocot 树

题目背景

这是一道模板题。(来源

为了帮小圆打败魔女之夜,你需要回答 Stern-Brocot 树上的询问。

题目描述

约定:

  • 本题中,输入/输出的所有分数都必须是既约的。
  • 本题中,输入的分数 pq\dfrac{p}{q} 都满足 1p,q1091\le p,q\le 10^9

Task 1:ENCODE_PATH

  • 输入格式:ENCODE_PATH pp qq
  • 输出格式:kk n1n_1 c1c_1 n2n_2 c2c_2 \cdots nkn_k ckc_k

给定分数 pq\dfrac{p}{q},你需要按照以下格式输出从 Stern-Brocot 树根走到节点 pq\dfrac{p}{q} 的路径:

kk n1n_1 c1c_1 n2n_2 c2c_2 \cdots nkn_k ckc_k

其中 ci{L,R}c_i\in \{\texttt{L},\texttt{R}\} 表示走到左儿子或者右儿子,nin_i 表示重复 cic_i 操作几次。

你需要保证 1i<k\forall 1\le i\lt kcici+1c_i\neq c_{i+1}

Task 2:DECODE_PATH

  • 输入格式:DECODE_PATH kk n1n_1 c1c_1 n2n_2 c2c_2 \cdots nkn_k ckc_k
  • 输出格式:pp qq

给定从 Stern-Brocot 树根出发的路径,格式如 Task 1 所述,输出节点上的分数。

保证答案满足 1p,q1091\le p,q\le 10^9

Task 3:LCA

给定 ab,cd\dfrac{a}{b},\dfrac{c}{d},输出 ab,cd\dfrac{a}{b},\dfrac{c}{d} 的 LCA 上的分数 pq\dfrac{p}{q}

  • 输入格式:LCA aa bb cc dd
  • 输出格式:pp qq

Task 4:ANCESTOR

给定 ab,k\dfrac{a}{b},k,输出 ab\dfrac{a}{b} 到根的链上,深度为 kk 的节点 pq\dfrac{p}{q} 的值。如果不存在,输出 1-1

  • 输入格式:ANCESTOR kk aa bb
  • 输出格式:pp qq
  • 数据范围:1k1091\le k\le 10^9

Task 5:RANGE

给定 pq\dfrac{p}{q},记在 Stern-Brocot 树中,pq\dfrac{p}{q} 的子树中的所有分数构成的集合为 SS。输出 infS=ab\inf S=\dfrac{a}{b}supS=cd\sup S=\dfrac{c}{d}

特别地,对于 00,输出 00 11;对于 ++\infty,输出 11 00

  • 输入格式:RANGE pp qq
  • 输出格式:aa bb cc dd

输入格式

第一行,一个正整数 TT,表示数据组数;

接下来 TT 行,每行若干个整数描述一个任务,格式见【题目描述】。

输出格式

输出 TT 行,表示对应任务的答案,格式见【题目描述】。

10
DECODE_PATH 0
DECODE_PATH 3 R 2 L 1 R 2
ENCODE_PATH 1 1
ENCODE_PATH 5 11
LCA 2 3 3 5
LCA 5439 19294 8291 29410
ANCESTOR 10 1 1
ANCESTOR 300 1000000000 1
RANGE 1 1
RANGE 11 8
1 1
11 4
0
2 L 2 R 4
2 3
148 525
-1
301 1
0 1 1 0
4 3 7 5

提示

  • 1T1051\le T\le 10^5
  • 输入的所有分数都是既约的;
  • 输入的分数 pq\dfrac{p}{q} 都满足 1p,q1091\le p,q\le 10^9