#loj5279. 「UOI 2019 Stage 4 Day2」皮罗格兰迪亚
「UOI 2019 Stage 4 Day2」皮罗格兰迪亚
[AdditionalFile5279.zip](file://AdditionalFile5279.zip?type=additional_file)
#5279. 「UOI 2019 Stage 4 Day2」皮罗格兰迪亚
标签: 传统 | 时间限制: 2000 ms | 内存限制: 512 MiB |
注意事项
在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:
- C++(标准为 C++ 14 及以上)
请在提交源代码前添加 #include "grader.h"。
题目描述
题目译自 Ukrainian Olympiads in Informatics 2019 Stage 4 Day2 T4. Пироголяндiя
众所周知,皮罗格兰迪亚是一个居民非常喜欢派的国家。因此,国内建有 家面包店,每家面包店有一个唯一的整数编号,从 到 。每家面包店都有一个仓库,存储一定数量的派,其中编号为 的面包店仓库中有 个派。
此外,一些面包店之间铺设有道路,可以通过这些道路将派从一个面包店运送到另一个面包店。总共铺设了 条道路,每条道路有一个唯一的整数编号,从 到 。第 条道路连接面包店 和 ,即可以在面包店 和 的仓库之间运输任意数量的派。
面包店 和 之间的路径定义为一系列唯一的面包店编号序列 ,使得每对相邻的面包店 和 (对于 从 到 )之间存在一条道路,且 以及 。已知每对面包店之间存在且仅存在一条不重复访问任何面包店的路径。
在皮罗格兰迪亚,有时会发生地震,导致一些道路可能被封锁,无法运输派。此外,道路维修服务有时会修复某些道路,使其重新可用于运输。因此,每条道路有两种状态:未封锁或封锁。
面包店 的连通分量定义为所有可以通过未封锁道路从编号为 的面包店到达的面包店集合。面包店 本身也包含在其连通分量中。
皮罗格兰迪亚最著名的居民之一是科扎克·武斯,他因在年度派爱好者节上吃掉最多派而广受欢迎。
在皮罗格兰迪亚,有时会发生与面包店、道路以及我们的朋友科扎克·武斯相关的各种事件。你需要处理 个事件,这些事件以不同类型的查询形式给出,并能够回答其中一些查询。
总共有 种类型的查询:
- 改变编号为 的道路的状态为相反状态。即如果查询前道路 是封锁的,则将其变为未封锁;如果之前是未封锁的,则将其变为封锁。
- 向编号为 的面包店所在连通分量中的每家面包店的仓库增加 个派。即如果面包店 属于面包店 的连通分量,则将 增加 。
- 将编号为 的面包店所在连通分量中所有面包店的派全部运输到编号为 的面包店仓库中。即在查询后,编号为 的面包店仓库中将存储其连通分量中所有面包店的派,而该连通分量中其他面包店的仓库将变为空。
- 科扎克·武斯想知道编号为 的面包店仓库中存储的派数量,即 的值。
- 科扎克·武斯想知道编号为 的面包店所在连通分量中所有面包店仓库存储的派总数。
- 科扎克·武斯吃掉编号为 的面包店所在连通分量中每家面包店仓库中的所有派。即在查询后,对于属于面包店 连通分量的每家面包店 , 的值应为 。
- 科扎克·武斯想知道需要修复的最小道路数量,以便他能吃掉皮罗格兰迪亚所有面包店仓库中的派,假设他可以从任意面包店开始,并且只能通过未封锁的道路移动。
请注意,类型为 、 和 的查询不会对面包店和道路产生任何影响,仅需提供答案。
交互方式
你需要实现以下八个函数:
void init(integer n, array of integers u, array of integers v, array of integers b, array of integers a, integer g)
- —— 皮罗格兰迪亚的面包店数量;
- 和 —— 连接第 条道路的面包店编号;
- —— 如果第 条道路是封锁的,则为 ,否则为 ;
- —— 第 家面包店的初始派数量;
- —— 子任务编号;
- 该函数首次调用,仅调用一次,用于告知你皮罗格兰迪亚的面包店数量、道路连接的面包店对、每条道路的状态、每家面包店仓库的初始派数量以及子任务编号。只有在调用该函数后,才会调用其他七个函数。
void query_1(integer p)
- —— 需要改变状态的道路编号;
- 该函数在需要执行第一类型查询时调用。
void query_2(integer p, integer w)
- —— 面包店编号;
- —— 向编号为 的面包店所在连通分量中每家面包店增加的派数量;
- 该函数在需要执行第二类型查询时调用。
void query_3(integer p)
- —— 面包店编号;
- 该函数在需要执行第三类型查询时调用。
integer query_4(integer p)
- —— 面包店编号;
- 该函数在需要执行第四类型查询时调用;
- 函数应返回一个整数,表示查询的答案。
integer query_5(integer p)
- —— 面包店编号;
- 该函数在需要执行第五类型查询时调用;
- 函数应返回一个整数,表示查询的答案。
void query_6(integer p)
- —— 面包店编号;
- 该函数在需要执行第六类型查询时调用。
integer query_7()
- 该函数在需要执行第七类型查询时调用;
- 函数应返回一个整数,表示查询的答案。
输入格式
第一行包含三个整数 ,分别表示皮罗格兰迪亚的面包店数量、事件数量和子任务编号。
接下来的 行,每行包含两个整数 和 ,表示连接第 条道路的面包店对。保证每对面包店之间存在且仅存在一条路径。
下一行包含一个长度为 的字符串,由字符 或 组成。第 个字符为 表示第 条道路是封锁的,为 表示未封锁。
再下一行包含 个整数 ,表示每家面包店仓库的初始派数量。
接下来的 行,每行描述一个查询。行首数字表示查询类型。如果是类型 查询,行内还包含两个参数 和 。如果是类型 查询,行内包含一个额外参数 。如果是类型 到 查询,行内包含一个额外参数 。如果是类型 查询,行内不包含额外参数。
输出格式
对于类型 、 和 的查询,在单独的一行上输出答案。
样例
输入
5 11 0
1 2
1 3
3 4
3 5
0100
1 0 6 1 3
5 3
3 4
2 5 4
4 3
7
6 4
1 2
5 4
2 2 1
1 3
5 2
输出
10
4
1
1
5
在图示中,面包店以圆形表示,圆内有两个整数——面包店编号和仓库中派的数量。未封锁的道路以实线表示,封锁的道路以虚线表示。
在图 中,展示了皮罗格兰迪亚在所有变化前的状态。编号为 的道路(连接面包店 和 )是封锁的。面包店 的连通分量(与面包店 的连通分量相同)包含面包店 和 。面包店 、 和 的连通分量包含面包店 、 和 ,因此面包店 所在连通分量的派总数为 。
在第二个查询后(图 ),面包店 和 将它们的派运输到面包店 的仓库中。
在第三个查询后(图 ),向面包店 、 和 的仓库各增加了 个派,因此面包店 仓库中的派数量现在为 。除了面包店 外,每家面包店的仓库中至少有 个派。如果科扎克·武斯从面包店 或 开始他的路径,他需要修复编号为 的道路才能到达面包店 。如果他从面包店 、 或 开始,则仍需修复编号为 的道路才能到达面包店 。因此,第五个查询的答案为 。
在第六个查询后(图 ),科扎克·武斯吃掉了面包店 仓库中的所有派。
在第七个查询后(图 ),道路维修服务修复了编号为 的道路,因此它现在变为未封锁状态。现在面包店 的连通分量(与其他所有面包店相同)包含皮罗格兰迪亚的所有面包店。因此,第八个查询的答案为 。
在第九个查询后(图 ),每家面包店的仓库中各增加了 个派。
在第十个查询后(图 ),由于地震,编号为 的道路被破坏,因此它变为封锁状态。现在面包店 的连通分量包含除面包店 外的所有面包店,而面包店 的连通分量仅包含它自身。因此,最后一个查询的答案为 。



数据范围与提示
详细子任务附加限制及分值如下表所示:
| 子任务 | 分值 | 附加限制 |
|---|---|---|
| ;;无类型 和 查询;所有道路初始为封锁 | ||
| ;;无类型 和 查询;所有道路初始为未封锁 | ||
| ;;无类型 和 查询 | ||
| ;;无类型 查询 | ||
| ; | ||
| 无类型 和 查询 | ||
| 无类型 查询;类型 查询中道路状态仅从封锁变为未封锁 | ||
| 无类型 查询 | ||
| 无类型 查询 | ||
| 每家面包店最多与两家其他面包店连接道路 | ||
| 无附加限制 |