loj#P3540. 「JOI Open 2018」山体滑坡

「JOI Open 2018」山体滑坡

题目描述

译自 JOI Open 2018 T3 「崖崩れ / Collapse

在 JOI 国有 NN​​ 个城镇,它们坐落于一个幽深峡谷中。城镇按到海洋的距离的顺序分别编号为 0,1,,N10,1,\ldots ,N-1

I 先生是 JOI 国科学委员会的主席,他准备维护城镇之间双向连接的电缆。目前 JOI 国没有电缆。

I 先生有一个 CC 天的电缆建设计划。第 (i+1) (0iC1)(i+1)\ (0\le i\le C-1)​ 天的计划用三个整数 Ti,Xi,YiT_i,X_i,Y_i 表示,分别表示:

  • 如果 Ti=0T_i=0,他们会架设一段连接城镇 XiX_i 与城镇 YiY_i 的电缆。保证在第 (i+1)(i+1) 天开始的时候城镇 XiX_i 与城镇 YiY_i 之间没有电缆。
  • 如果 Ti=1T_i=1​,他们会拆除一段连接城镇 XiX_i​ 与城镇 YiY_i​ 的电缆。保证在第 (i+1)(i+1)​ 天开始的时候城镇 XiX_i​ 与城镇 YiY_i​ 之间有电缆。

JOI 国经常发生山体滑坡。如果在城镇 xxx+1 (0xN2)x+1\ (0\le x\le N-2)​ 之间发生山体滑坡,则连接编号至多为 xx 与编号至少为 x+1x+1​ 城镇的电缆就不可用了。在 JOI 国,每当山体滑坡发生,他们就会选择一些城镇建设基站。基站应满足对于任意城镇,都可以通过一些可用的电缆与基站连通。

I 先生在建设阶段就在考虑山体滑坡发生时应建设多少基站。他有 QQ 个问题:第 (j+1)(j+1) 个问题用两个整数 Wj,PjW_j,P_j 表示,表示他想知道在 (Wj+1)(W_j+1) 天结束时,如果在城镇 PjP_jPj+1P_j+1 之间发生山体滑坡,至少应该建立多少基站。

你作为 I 先生的助理,负责写一个程序去回答 I 先生的问题。

样例

考虑有 55 个城镇的情况。接下来用 (x,y)(x,y) 代表连接城镇 xx 和城镇 yy 的电缆。

  • 假设当有四根电缆 (0,1),(1,3),(2,4),(4,0)(0,1),(1,3),(2,4),(4,0) 时,在城镇 1122 之间发生了滑坡。电缆 (1,3)(1,3)(4,0)(4,0) 不可用了,因此可用的电缆是 (0,1)(0,1)(2,4)(2,4)。你需要在城镇 0,2,30,2,3 建立基站。最少要建立基站数为 33
  • 假设当有六根电缆 (0,1),(0,3),(1,2),(2,4),(4,0)(0, 1), (0, 3), (1, 2), (2, 4), (4, 0)​​ 和 (4,3)(4,3)​​ 时,在城镇 33​​ 和 44​​ 之间发生了滑坡。电缆 (2,4),(4,0)(2,4),(4,0)​​ 和 (4,3)(4,3)​​ 不可用了,因此可用的电缆是 (0,1),(0,3)(0,1),(0,3)​​ 和 (1,2)(1,2)​​。你需要在城镇 00​​ 和 44 建立基站。最少要建立基站数为 22​​。

子任务

本题有四个子任务。子任务分值及附加限制如下表所示:

子任务编号 分值 NN C,QC,Q 附加限制
11 55 2N5 0002\le N\le 5\ 000 1C,Q5 0001\le C,Q\le 5\ 000
22 3030 2N100 0002\le N\le 100\ 000 1C,Q100 0001\le C,Q\le 100\ 000 所有 Pj (0jQ1)P_j\ (0\le j\le Q-1) 都相等
33 3030 2N100 0002\le N\le 100\ 000 1C,Q100 0001\le C,Q\le 100\ 000 Ti=0 (0iC1)T_i=0\ (0\le i\le C-1)
44 3535 2N100 0002\le N\le 100\ 000 1C,Q100 0001\le C,Q\le 100\ 000

实现细节

你需要实现如下函数 simulateCollapse\texttt{simulateCollapse} 以回答 QQ 个问题。

  • simulateCollapse(N, T, X, Y, W, P)\texttt{simulateCollapse(N, T, X, Y, W, P)}
    • N\texttt N:JOI 国的城镇个数。
    • T, X, Y\texttt{T, X, Y}:长度为 CC 的数组。对于 0iC10\le i\le C-1Ti,Xi,YiT_i,X_i,Y_i 表示在第 (i+1)(i+1) 天的建设计划。保证 TiT_i 等于 0011,并且保证 0XiN1,0YiN1,XiYi0\le X_i\le N-1,0\le Y_i\le N-1,X_i\neq Y_i
    • W, P\texttt{W, P}:长度为 QQ 的数组。对于 0iQ10\le i\le Q-1Wj,PjW_j,P_j 表示第 (j+1)(j+1) 个询问,保证 0WjC1,0PjN20\le W_j\le C-1,0\le P_j\le N-2
    • 这个函数应当返回一个长度为 QQ 的数组 DD。对于 0jQ10\le j\le Q-1DjD_j 应该是对第 (j+1)(j+1)​ 个问题的回答。

C++ 的提交应引入库 collapse.h\texttt{collapse.h}​ 来完成,目前不支持对 Java 和 Pascal 语言提交的测评。

样例交互器

样例交互器按如下格式读取输入:

第一行三个整数 N,C,QN,C,Q

接下来 CC 行,每行三个整数 Ti,Xi,YiT_i,X_i,Y_i

接下来 QQ 行,每行两个整数 Wj,PjW_j,P_j

样例交互器按如下方式输出 simulateCollapse\texttt{simulateCollapse}​ 函数的返回值:

j+1j+1 行输出 DjD_j