#L3540. 「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)(i+1) 天(0iC10\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+1x+10xN20\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 先生的问题。

实现细节

函数定义

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


std::vector<int> simulateCollapse(
    int N, 
    std::vector<int> T, 
    std::vector<int> X, 
    std::vector<int> Y, 
    std::vector<int> W, 
    std::vector<int> P
)

参数说明

  • N:JOI 国的城镇个数。

  • T, X, Y:长度为 CC 的数组。对于 0iC10 \le i \le C-1Ti,Xi,YiT_i, X_i, Y_i 表示在第 (i+1)(i+1) 天的建设计划。保证 TiT_i 等于 0011,并且保证 0XiN10 \le X_i \le N-10YiN10 \le Y_i \le N-1XiYiX_i \neq Y_i

  • W, P:长度为 QQ 的数组。对于 0iQ10 \le i \le Q-1Wj,PjW_j, P_j 表示第 (j+1)(j+1) 个询问,保证 0WjC10 \le W_j \le C-10PjN20 \le P_j \le N-2

返回值

这个函数应当返回一个长度为 QQ 的数组 DD。对于 0jQ10 \le j \le Q-1DjD_j 应该是对第 (j+1)(j+1) 个问题的回答。

技术说明

C++ 的提交应引入库 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 函数的返回值:

j+1j+1 行输出 DjD_j

5 8 2
0 0 1
0 1 3
0 2 4
0 4 0
1 1 3
0 0 3
0 1 2
0 4 3
3 1
7 3

3
2

样例

考虑有 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) 时,在城镇 3344 之间发生了滑坡。电缆 (2,4),(4,0)(2,4),(4,0)(4,3)(4,3) 不可用了,因此可用的电缆是 (0,1),(0,3)(0,1),(0,3)(1,2)(1,2)。你需要在城镇 0044 建立基站。最少要建立基站数为 22

数据规模与约定

2<N1000002 < N \leq 100000

1<C1000001 < C \leq 100000

1<Q1000001 < Q \leq 100000