loj#P3931. 「WC2023 / CTS2023」楼梯

「WC2023 / CTS2023」楼梯

题目背景

长颈鹿累了,他开始做梦。

在梦中他下坠。他穿过草地,穿过打着转的羊群。他穿过星海,穿过漫天的火羽。

终于,他站在了一块屏幕前。屏幕上展示着某种类似楼梯的图样。

题目描述

我们首先给出一些关于楼梯的形式定义。

我们称一对正整数组成的二元组 (x,y)(x,y)格子,称格子构成的集合 LL(可以为空)为 楼梯 当且仅当其满足下面两个条件:

  • (x,y)L(x,y)\in Lx>1x>1,则 (x1,y)L(x-1,y)\in L
  • (x,y)L(x,y)\in Ly>1y>1,则 (x,y1)L(x,y-1)\in L

对于一个楼梯 LL(x,y)L(x,y)\in L,我们定义 (x,y)(x,y)生成格 生成的 子楼梯

$$\{(a-x+1, b-y+1) \mid (a,b) \in L, a \ge x, b \ge y\} $$

容易证明这一集合仍然是一个楼梯。对于一个楼梯 LL,我们定义 边界格数 为满足 x=1x=1y=1y=1(x,y)L(x,y) \in L 的数量。

为了方便理解,我们接下来给出直观解释。我们在平面上可以将所有格子按从左到右 yy 坐标递增、从上到下 xx 坐标递增的顺序排列成网格,因此我们也称 (x,y)(x,y) 为第 xx 行第 yy 列的格子。

在这一解释下,若一个格子属于某个楼梯,且它上方和左方不是边界,则对应格子也属于这个楼梯。子楼梯就是生成格右下方区域格子所构成的非空楼梯,一个楼梯的边界格数是上边界或左边界上的总格数。

如下图,$(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4),(3,1),(3,2),(3,3),(4,1),(5,1)$ 组成了一个合法的楼梯。这一楼梯的边界格数为 88,其中以 (1,3)(1,3) 作为生成格生成的子楼梯的边界格数为 44

长颈鹿看到屏幕上的楼梯后很好奇。他首先计算出了这一楼梯的边界格数 pp,并给定了 pp 的某一 正整数因子 qq。他想要知道,给定的楼梯是否有子楼梯满足边界格数等于 qq。如果是,他希望你给出 任一 这样的子楼梯的生成格。

梦境时常变化,因此长颈鹿可能会有许多次这样的询问,楼梯也可能会发生变化。初始楼梯 LL 为空,对于 i1i \ge 1sis_i 为最大的满足 (i,si)L(i,s_i) \in L 的正整数,若不存在则令其为 00,则有若干次三种之一的修改:

  • 给定正整数 aabb,在前 aa 行的末尾插入 bb 格。形式化地,对于 i=1,2,,ai=1, 2, \cdots, a,将 (i,si+1),(i,si+2),,(i,si+b)(i,s_i+1), (i,s_i+2),\cdots,(i,s_i+b) 加入 LL
  • 给定正整数 aabb,在第 aa 行后(包含第 aa 行)的所有行行末尾删去 bb 格,若不足则删空。形式化地,对于 i=a,a+1,a+2,,10100i=a,a+1,a+2,\cdots,10^{100},将 (i,si),(i,si1),,(i,sib+1)(i,s_i),(i,s_i−1),\cdots,(i,s_i−b+1)LL 中移除(不存在的则忽略)。
  • 给定正整数 uu,撤销之前的 uu 次操作,即将楼梯还原为 uu 次操作前的状态,保证这 uu 次操作均为询问或在行末尾插入。具体地,假设该操作为第 tt 次操作,我们一定有 t>ut>u,且第 t1,t2,,tut−1,t−2,\cdots,t−u 次操作均为询问或在行末尾插入(即上述的第一种修改)。你只需要将楼梯还原为第 tut−u 次操作前的状态即可(当然,你应该保留询问的输出)。

可以证明每次修改之后得到的集合仍然是一个楼梯。

输入格式

从文件 stairs.in 中读入数据。

输入数据第一行包含一个正整数 mm,表示操作总数。

接下来 mm 行每行描述四种之一的操作,详细含义可参见题目描述一节。描述为由空格分隔的一个字符和一到两个正整数,具体地:

  • + a b:在前 aa 行的末尾插入 bb 格。
  • - a b:在第 aa 行后(包括第 aa 行)的所有行行末尾删去 bb 格,若不足则删空。
  • R u:撤销之前的 uu 次操作,即将楼梯还原为 uu 次操作前的状态。保证这 uu 次操作存在且均为询问或在行末尾插入,即该行之前的 uu 行均以 +? 开头。
  • ? q:询问是否有边界格数等于 qq 的子楼梯,若有则给出任意合法生成格。保证 qq 是当前楼梯边界格数的因子

输出格式

输出到文件 stairs.out 中。

对于每个询问(? 操作)输出一行。

如果存在边界格数等于 qq 的子楼梯,输出一行两个用空格分隔的正整数 x y,表示一个合法生成格是 (x,y)(x,y)。否则输出一行两个用空格分隔的 1-1

18
+ 5 1
+ 2 1
? 3
+ 3 2
? 4
? 4
+ 4 1
? 3
R 3
- 2 2
? 3
- 1 1
? 2
? 4
- 1 2
? 1
- 9 9
? 1
3 1
1 3
2 2
2 4
2 1
1 2
1 1
1 1
1 1

样例 2

见附件中的 stairs2.instairs2.ans

样例 3

见附件中的 stairs3.instairs3.ans

样例 4

见附件中的 stairs4.instairs4.ans

样例 5

见附件中的 stairs5.instairs5.ans

样例 6

见附件中的 stairs6.instairs6.ans

数据范围与提示

对于所有测试数据,1m3×1051 \le m \le 3 \times 10^5

  • 对于 +- 操作,1a,b1091 \le a, b \le 10^9
  • 对于 R 操作,保证之前紧邻的 uu 次操作存在且均为询问或在行末尾插入。
  • 对于 ? 操作,1q10181 \le q \le 10^{18}保证为当前楼梯边界格数的因子

amaxa_{\max} 为所有 +- 操作中 aa 的最大值,bmaxb_{\max} 为所有 +- 操作中 bb 的最大值。

测试点 m=m = amaxa_{\max} \leq bmaxb_{\max} \leq 特殊性质
11 200200 5050 2020
22 400400 100100 AB
33 600600 500500 500500 A
44 800800 10610^6
55 10310^3
66 30003000 10610^6 B
77 50005000 AB
88 10410^4 10910^9
99 3×1043 \times 10^4 A
1010 5×1045 \times 10^4
1111 7×1047 \times 10^4
1212 10510^5 B
1313 1.2×1051.2 \times 10^5
1414 1.4×1051.4 \times 10^5 10610^6
1515 1.6×1051.6 \times 10^5 AB
1616 1.8×1051.8 \times 10^5 10910^9
1717 2×1052 \times 10^5 10610^6 B
1818 2.5×1052.5 \times 10^5
1919 2.7×1052.7 \times 10^5 10910^9
2020 3×1053 \times 10^5

其中附加限制中的特殊性质如下所示:

  • 特殊性质 A\text A? 操作在所有 +- 操作之后。没有 R 操作。
  • 特殊性质 B\text B:没有 - 操作。

请注意选用合适的数据类型存储各结果。