考试整理T3

直接题解...
T3(【音乐会】道路千万条):

因为没有这台激活的Windows被网友们吐槽了,所以导演郭帆找到了你,想让你帮忙装一个Linux。

然而,Linux的模块之间有着复杂的依赖关系。简单来说,如果要使某一个模块正常运行,那么就要解决子模块间的冲突关系。

对于一个只有两个子模块的模块来说,使这个模块运行有三种可能的情况:子模块必须都运行;子模块只需运行一个;子模块只能运行一个。而对于多余两个的模块,系统会把一些子模块合并,这样,每个模块就只包含两个子模块。同时这些合并出来的新的子模块仍然和父模块一样满足这些关系。

设有两个子模块x,y。必须都运行时,你可以用x&y来表示;只需运行一个时,你可以用x|y来表示;只能运行一个时,你可以用x^y来表示。而如果他们被合并,你可以在这个表达式的外面添加括号来表示。

例如:(a&b)^(c|d)表示a b构成的子模块和c d构成的子模块只能运行一个;a b构成的子模块想要运行,就必须同时运行a b;c d构成的子模块想要运行,只需要运行c或者d。所以以下几组a b c d的运行情况是满足条件的:
[c] [a c] [b c] [d] [a d] [b d] [c d] [a c d] [b c d][c][ac][bc][d][ad][bd][cd][acd][bcd]
在你的帮助下,Linux安装成功。但是问题来了:你需要添加一些新的模块,删除一些模块,启动一些模块,关闭一些模块。可是启动日志里只给出了每个子模块的运行状态,以及子模块之间的冲突关系,没有告诉你系统把那些子模块合并在了一起。

这很难办。为了预估随机算法的风险,你需要计算当你随机选择一个合并方案时能够使系统正常运行的概率。对998244353取模。

思路就是靠线段树
先放代码(不想讲):


posted @ 2019-06-29 16:20  _Alex_Mercer  阅读(174)  评论(0编辑  收藏  举报