#P2343. 「JOI Open 2018」山体滑坡

「JOI Open 2018」山体滑坡

题目描述

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

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

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

I 先生有一个 CC 天的电缆建设计划。第 (i+1) (0≤i≤C−1)(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 国经常发生山体滑坡。如果在城镇 xx 与 x+1 (0≤x≤N−2)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_j 和 Pj+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) 时,在城镇 11 和 22 之间发生了滑坡。电缆 (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 2≤N≤5 0002\le N\le 5\ 000 1≤C,Q≤5 0001\le C,Q\le 5\ 000 无
22 3030 2≤N≤100 0002\le N\le 100\ 000 1≤C,Q≤100 0001\le C,Q\le 100\ 000 所有 Pj (0≤j≤Q−1)P_j\ (0\le j\le Q-1) 都相等
33 3030 2≤N≤100 0002\le N\le 100\ 000 1≤C,Q≤100 0001\le C,Q\le 100\ 000 Ti=0 (0≤i≤C−1)T_i=0\ (0\le i\le C-1)
44 3535 2≤N≤100 0002\le N\le 100\ 000 1≤C,Q≤100 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 的数组。对于 0≤i≤C−10\le i\le C-1,Ti,Xi,YiT_i,X_i,Y_i 表示在第 (i+1)(i+1) 天的建设计划。保证 TiT_i 等于 00 或 11,并且保证 0≤Xi≤N−1,0≤Yi≤N−1,Xi≠Yi0\le X_i\le N-1,0\le Y_i\le N-1,X_i\neq Y_i。
    • W, P\texttt{W, P}:长度为 QQ 的数组。对于 0≤i≤Q−10\le i\le Q-1,Wj,PjW_j,P_j 表示第 (j+1)(j+1) 个询问,保证 0≤Wj≤C−1,0≤Pj≤N−20\le W_j\le C-1,0\le P_j\le N-2。
    • 这个函数应当返回一个长度为 QQ 的数组 DD。对于 0≤j≤Q−10\le j\le Q-1,DjD_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。