#P123333. 第4题-层级状态传导系统
-
1000ms
Tried: 1
Accepted: 1
Difficulty: 8
第4题-层级状态传导系统
解题思路
核心是把“是否活跃”看成一层层的或关系:
原子信号 → 聚合器 → 终端 → 面板
直接每次操作后全部重新计算也能做,但不够优雅。更好的方式是维护计数:
- 每个聚合器维护当前有多少个原子信号处于活跃状态。
题目内容
在一个监控系统中,存在四种实体:原子信号、聚合器、终端和面板。每个原子信号可以处于「活跃」或「非活跃」状态。聚合器由若干原子信号组成,只要其中至少有一个原子信号活跃,该聚合器即为活跃。终端需要关联一个或多个实体(可以是原子信号或聚合器),只要任一关联对象活跃,终端即为活跃。面板关联一个或多个终端,只要任一关联终端活跃,面板即为活跃。
你需要维护这些实体并处理一系列操作。操作包括:激活某个原子信号、关闭某个原子信号、查询某个终端是否活跃、查询某个面板是否活跃、将终端与某个实体绑定、解除终端与某个实体的绑定。如果操作不合法(如重复绑定、解除不存在的绑定、操作不存在的名称等),则直接忽略。
约束条件:原子信号的数量不超过 500,聚合器的数量不超过 50,终端数量不超过 300,面板数量不超过 100,操作次数不超过 2000。所有实体名称均由大小写字母和数字组成。
输入描述
第一行包含四个整数 N、M、D、R,分别表示原子信号的数量、聚合器的数量、终端的数量和面板的数量。
接下来 N 行,每行包含一个字符串和一个整数 s∈{0,1},表示一个原子信号的名称及其初始状态(1 为活跃,0 为非活跃)。
接下来 M 行,每行的第一个字符串为聚合器名称,接着一个整数 k(k≥1),然后是 k 个字符串,表示该聚合器包含的原子信号名称。
接下来 D 行,每行的第一个字符串为终端名称,接着一个整数 k(k≥1),然后是 k 个字符串,表示该终端关联的实体名称(可以是原子信号或聚合器)。
接下来 R 行,每行的第一个字符串为面板名称,接着一个整数 k(k≥1),然后是 k 个字符串,表示该面板关联的终端名称。
接下来一行包含一个整数 S,表示将要执行的操作数量。
接下来的 S 行,每行描述一个操作,操作共有六种类型:
Activate name:将原子信号name设置为活跃。Deactivate name:将原子信号name设置为不活跃。Query name:查询终端name当前是否活跃。QueryPanel name:查询面板name当前是否活跃。Link device entity:将终端device与实体entity进行绑定。Unlink device entity:将终端device与实体entity的绑定移除。
操作涉及的名称如果不存在、重复绑定或解除未绑定等非法情况,均不产生任何效果。
输出描述
对于每个 Query 或 QueryPanel 操作,输出一行 YES 或 NO,表示目标终端或面板当前是否活跃。每次操作完成后,如果有某些面板的状态从活跃变为不活跃,则需要按这些面板在输入中出现的顺序,每行输出一个面板名称。
样例1
输入
2 1 2 1
a1 1
a2 0
g1 2 a1 a2
d1 1 a1
d2 2 a2 g1
p1 2 d1 d2
5
Ask d1
Hide a1
Ask d1
AskUI p1
Hide a2
输出
YES
p1
NO
NO
说明
初始状态:原子信号 a1 活跃(a1=1),a2 不活跃(a2=0)。聚合器 g1 包含 a1 和 a2,由于 a1 活跃,g1 活跃。终端 d1 绑定 a1,因此活跃;d2 绑定 a2 和 g1,由于 g1 活跃,因此 d2 活跃。面板 p1 关联 d1 和 d2,因两者均活跃,p1 活跃。
Ask d1:此时d1活跃,输出YES。Hide a1:将a1关闭。d1失去唯一活跃源变为不活跃;g1中活跃信号数变为0,变为不活跃;d2依赖的g1不再活跃,且a2原本不活跃,因此d2也变为不活跃。p1关联的d1和d2均不再活跃,因此p1从活跃变为不活跃,按输入顺序输出p1。Ask d1:d1不活跃,输出NO。AskUI p1:p1不活跃,输出NO。Hide a2:a2原本不活跃,操作无变化,无输出。
样例2
输入
2 0 2 1
a1 1
a2 0
d1 1 a1
d2 1 a2
p1 1 d1
8
Bind d1 a2
Ask d1
Remove d1 a2
Ask d1
Bind d1 a2
Bind d1 a2
Remove d1 a3
AskUI p1
输出
YES
YES
YES
说明
初始状态:原子信号 a1 活跃(1),a2 不活跃(0)。无聚合器。终端 d1 绑定 a1,活跃;d2 绑定 a2,不活跃。面板 p1 绑定 d1,由于 d1 活跃,p1 活跃。
Bind d1 a2:将终端d1与实体a2绑定。a2当前不活跃,因此不改变d1的活跃计数,d1仍活跃。Ask d1:d1活跃,输出YES。Remove d1 a2:解除d1与a2的绑定。由于a2不活跃,移除不影响计数,d1保持活跃。Ask d1:输出YES。Bind d1 a2:再次绑定a2,仍不活跃,无影响。Bind d1 a2:重复绑定同一实体,属于非法操作,被忽略。Remove d1 a3:a3不存在且未绑定,非法,被忽略。AskUI p1:p1关联的d1依然活跃,输出YES。
整个过程中没有任何面板从活跃变为不活跃,故无面板输出。最终输出三个 YES。
样例3
输入
3 1 2 2
r1 0
r2 0
r3 0
g1 2 r1 r2
t1 2 r1 g1
t2 1 r3
p1 1 t1
p2 1 t2
7
Ask t1
Show r1
Ask t1
AskUI p1
Hide r3
AskUI p2
Show rX
输出
NO
YES
YES
NO
说明
初始所有原子信号均为不活跃(0)。聚合器 g1 包含 r1 和 r2,计数为 0,不活跃。终端 t1 绑定 r1 和 g1,均不活跃,t1 不活跃;t2 绑定 r3,不活跃。面板 p1 关联 t1,不活跃;p2 关联 t2,不活跃。
Ask t1:t1不活跃,输出NO。Show r1:激活原子信号r1。t1直接绑定r1,计数变为1,t1变为活跃。同时r1使聚合器g1计数变为1,g1变为活跃;t1因绑定g1再次收到通知,但由于已经活跃,状态不变(计数继续增加但无面板影响)。面板p1因t1从非活跃变活跃而变为活跃,但只输出“从活跃变为不活跃”的面板,故此处无输出。Ask t1:t1活跃,输出YES。AskUI p1:p1活跃,输出YES。Hide r3:r3原本不活跃,无变化,无输出。AskUI p2:p2仍不活跃,输出NO。Show rX:名称rX不存在,操作被忽略,无输出。
整个过程没有面板从活跃变为不活跃,因此输出中只包含查询结果 NO、YES、YES、NO。
本题属于以下题库,请选择所需题库进行购买