NOIAC挑战赛部分题解
NOIAC挑战赛部分题解
T1
http://noi.ac/contest/351/problem/2016
题目描述
小 H 开了一家工厂,工厂有 \(n\) 个工人和 \(p\) 条流水线。第 \(i\) 个工人只会在 \(s_i\) 到 \(t_i\) 的时刻工作。
每个工人都会被分派到一条流水线上,然而,一条流水线只会在这条线的工人到齐时才能开工,其余时间即使有部分工人到了也只能休息。
由于工厂老板是黑心老板,所以不能有流水线的工作时间为 \(0\),也不能有工人没被分派到流水线上(即使这样会降低实际工作时间)。
在上面的条件下,黑心老板想让所有流水线的开工时间之和最长,但是他不会算,所以他想请你求出能得到的最大的工作时间总和。
数据范围
对于所有数据满足 \(1\le p\le n\le 200,0\le s_i\le t_i\le 10^5\)。
解题思路
其实这题有想到
显然如果两个区间存在包含关系可以直接把小区间留下,大区间扔到一边去,因为小区间和大区间同时存在时,大区间无法发挥作用,大区间如果和别的区间一组时会对别人有限制,而和小区间不会,综上所述,大区间要么单独一个流水线,要么和被包含的区间一个流水线
然后考虑所有相交但不包含的区间,直接排个序 + dp 即可
T2
题目大意
小 D 在玩一款角色扮演游戏,通过前期的打怪,他现在得到了 \(k\) 个不同的装备。
众所周知,角色扮演游戏中常常有复杂的人物属性,在这款游戏中,小 D 一共有 \(n\) 种不同的属性,而每件装备都会都对这 \(n\) 种属性有不同buff效果。
今天,小 D 走到一家铁匠铺里去合成装备。他每次可以将两个装备合成一个标号为 \(m + 1\)(\(m\) 为当前装备个数)的新装备(原来的两个装备不会消失),但是由于小 D 锻造技术不高,所以合成有可能成功也有可能失败。如果合成成功,他会得到一个新装备,而新装备的各项属性的buff是两个装备对应属性的\(\max\),而如果合成失败,他会得到一个新装备,新装备的各项属性的buff是两个装备对应属性的\(\min\)。
\(1\) \(x\) \(y\) : 表示小 D 将第 \(x\) 和第 \(y\) 个装备合成了,并且合成成功。
\(2\) \(x\) \(y\) : 表示小 D 将第 \(x\) 和第 \(y\) 个装备合成了,并且合成失败。
\(3\) \(x\) \(y\) : 小 D 想知道第 \(x\) 装备的第 \(y\) 项属性的buff是多少。
数据范围
对于 \(100\%\) 的数据,满足 \(1\le n, q\le 10^5, k \le 12, 1\le a_{ij} \le 10^9\)。
解题思路
好神奇的思路?!发现 k 特别小?
设一个集合的集合,即集族
一开始第 k 个装备的集族是所有包含 k 的小集合,这时肯定是对的,min 的时候一定可以取到 k 且小于等于 k
考虑一操作就是两个集族取并,二操作就是两个集族取交
考虑这样为什么是对的,取并是包含两个旧集族的任意元素都行,取交代表一定两个集族的元素同时出现才行
直接手玩一下会更好理解
乱搞题
http://noi.ac/contest/356/problem/2029
题目大意
完美二叉树是指,最深一层的所有节点没有孩子,其余所有节点均有两个孩子的二叉树。
将一棵高度不超过 \(h\) 的树扩充到高度 \(h\) 是指,将这棵树(通过添加缺失的孩子)补充为高度为 \(h\) 的完美二叉树,此过程中新创建的节点权值均为 0。
一棵完美二叉树上某个节点的关键值是指,如果该节点的权值非 0,则该点的关键值就等于该点的权值,否则该点的关键值等于该点父亲节点的关键值。因为根节点的权值不为 0,所以任意节点的关键值都是明确定义的。
一棵完美二叉树的关键值序列是指,从左到右考虑该树最深一层的所有节点,依次求出这些节点的关键值,将这些值按顺序排成一个序列。
判断两棵树是否等价的方法是,设这两棵树的高度较大者为 \(h\),分别将这两棵树扩充到高度 \(h\),得到的两棵高度为 \(h\) 的完美二叉树的关键值序列如果完全相同,则两棵树等价,否则两棵树不等价。
数据范围
解题思路
是乱搞题又很有趣
为了方便我们把它所有的节点都补满(都获得左右儿子,权值和父亲相同),这样答案显然不会变
设计 dp,\(dp[x][y]\) 表示在 \(x\) 节点,由祖先继承过来的权值是 \(y\) 的最小代价是多少
在叶子节点有 \(dp[x][y] = (val[x] \neq y)\)
非叶子节点有 \(dp[x][y] = \min((y \neq k) + dp[ls][k]+dp[rs][k])\)
另外一个性质是显然一个节点的 dp 值中的最大值最小值不超过一
据此我们用线段树合并来维护(或许可以成为整体 dp)x 节点 dp 最小值的位置(设为 1),两个节点合并起来显然就是取并,如果并集为空那么就是取交,同时维护一下 dp 最小值是多少即可