核心是把“是否显示红点”看成一层层的或关系:
红点类型 → 红点集合 → 按钮 → 界面
直接每次操作后全部重新计算也能做,但不够优雅。更好的方式是维护计数:
一款游戏里总是会有很多的红点,用来提醒玩家做某些任务或者领取奖励,今天我们就来实现一个简易的红点系统。
假设一款游戏里有 N 种红点类型,每种红点类型都有两个状态:显示和隐藏。
有 M 种红点类型集合,一种红点类型集合是由 1 种或者多种不同的红点类型组合而成的,只要其中任意一种红点类型的状态为显示,则该红点类型集合的状态为显示。
游戏内有 X 个按钮,每个按钮会与一种或者多种红点类型/红点类型集合进行绑定,如果与其绑定的任意按钮是显示状态,则该按钮就是有红点显示的状态。
游戏内有 Y 个界面,每个界面会与一个或者多个按钮进行绑定,如果与界面绑定的任意按钮是显示状态,则该界面就是有红点显示的状态。
三个整数 N,M,X,Y(1≤N≤500,1≤M≤50,1≤X≤300,1≤Y≤100)。
接下来 N 行,每行为两个数据 Name1 和 State,分别表示红点类型的名称和状态,State 为 1 表示显示,为 0 表示隐藏。
接下来的 M 行,每行是一个字符串 Name2 和一个数字 num1,表示该红点类型集合的名称,以及该红点类型集合由 num1 种红点组成,紧接着是 num1 个字符串,表示对应的红点类型名称。
接下来的 X 行,每行是一个字符串 Name3 和一个数字 num2,表示按钮的名称和按钮关联的红点类型/红点类型集合的数量,紧接着 num2 个字符串,表示对应的红点类型/红点类型集合的名称。
接下来的 Y 行,每行是一个字符串 Name4 和一个数字 num3,表示界面的名称和界面绑定的按钮的数量,紧接着是 num3 个字符串,表示对应的按钮的名称。
接下来是一个整数 S(1≤S≤2000),表示会有 S 个红点相关的操作,具体操作会有如下几种:
以上操作如果不合法则不产生任何影响,不合法包括移除原本不存在的关联、添加已有的关联等等。操作过程中不会修改红点类型集合与红点类型之间的组合关系。
以上操作执行后,如果一个界面从有红点显示的状态变成了无红点显示的状态,则需要输出该界面的名称。
输入数据的所有字符串均由大小写字母和数字构成。
针对每个 Ask 的询问,输出一行 YES 或者 NO。
操作执行后,如果一个界面从有红点显示的状态变成了无红点显示的状态,则需要输出该界面的名称,如果同时有多个界面变成无红点显示的状态,则按照输入的界面顺序输出多行。
输入
3 1 3 2
Red1 1
Red2 0
Red3 1
RedGP1 2 Red1 Red2
Btn1 1 Red1
Btn2 2 Red1 Red3
Btn3 2 RedGP1 Red3
Panel1 1 Btn1
Panel2 2 Btn2 Btn3
6
Ask Btn2
Hide Red3
Hide Red1
Ask Btn2
Ask Btn3
Show Red2
输出
YES
Panel1
Panel2
NO
NO