2021_9.29-10.5训练
ICPC网络赛#2021第二场
H.Set
对于这种咋一看不知从何入手的题目,可以想想能否“乱搞”,即利用某种极端的条件或者这个题目某种特殊的性质入手研究整个问题。
这里需要知道一个东西,叫做Union bound,然后我们可以计算出随机选一组解为非法解的概率的上界,结果惊人地小,于是我们可以直接使用random_shuffle
构造一组答案,问题就解决了
1 |
|
2016-2017 ACM-ICPC Northeastern European Regional Contest (NEERC 16)
B.Binary Code
本质是一个不太难的 trie + 2-SAT,注意总的字符数量是有上限的,以及在 trie 上同一个点结尾的字符串的数量不可以超过这个点的深度+1,即必须满足 ,不然一定无解。所以可以建边的数量最多达到量级,是可以接受的。
还有就是,没有’?'的节点,它的反点是违法的,所以我们连一条反点到该点的边,这样就增加了不能选择反点的限制
1 |
|
C.Cactus Construction
这是一个结合了仙人掌树的构造题。为了方便思考,可以先考虑简单的情况,比如如果是一个树,可以怎么办呢?
如果只是一个树,即没有环的话,只用三种颜色即可,先把要连的父节点染成3,把当前子树的端点置为2,然后把两个点合到一个图内,然后连接。最后把颜色为2的置为1,颜色为3的置为2,这样就能递归地做下去。
如果有环的话,可以先跑一个dfs,这样确定环的产生都源自于返祖边。对于返祖边连到的那个“祖先”,我们可以把它和返祖边所连的那个“后代”连起来,再把这个“祖先”的颜色变为4,这样到时候就可以对它进行单独操作。注意,这样需要保证在整个操作的过程,同时存在的颜色为4的点的数量最多只有一个,所以要分类讨论一下,具体可以参见代码。
1 |
|
E.Expect to Wait
当时训练的时候居然没想出来这个题…简直太逆天了
很简单的题目,甚至可以说是签到了。
只要记录一下各个时间段的情况,然后类似于扫描线的思想,一直往上加初始车辆就行了
1 |
|
G.Game on Graph
很妙的博弈题。
最开始想了个 naive 的 dp,后来发现涉及到无穷的时候理不清逻辑…
把每个点拆成两个,分别表示起点为这个点时,轮到两个人中的第一个人或第二个人先手。
可以先考虑平局,然后第一个人肯定是想要平,第二个尽量不想平,所以可以根据这个得到哪些点是平局的,然后再考虑输赢。
注意到这里使用的是拓扑排序的方法更新节点状态的,有些点的入度可能不会变成 0,所以就不会被更新状态。但是再一想,拓扑序不为 0,不就是永远不停下来了嘛!所以这就相当于平局,但是第二个人比起输,他更不想平,所以第二个人会选择输。所以我们就要再把没有更新过状态的点(即跑完拓扑排序后入度仍不为0的点)处理为第一个人赢,第二个人输。
1 |
|