「考试总结」ZROI-21-NOIP冲刺-TEST6 总结
莫要问 TEST5 去哪了,他有 4 道巨大恶心的计数题,补不动了QwQ
#T1 夏令营
#题意简述
给定 \(n(n\leq3\times10^5)\) 个区间,每个区间有价值 \(h_i(1\leq3\times10^5)\),每个点 \(i(i\in[1,D])\) 只能选最多 \(k\) 个覆盖该点的区间,问可到的价值和最大的点的最大价值和。
#大体思路
注意到我们只关注单点,且对于覆盖信息相同的点并没有实际区别,于是我们可以考虑将原本的一个区间拆成两个操作:加入和删除。
现在考虑如何快速维护这两个操作。注意到覆盖每个点的的区间分为两部分:包含在该点的答案里的和候选的,如果我们按照时间顺序维护这两个操作,不难发现,当新加入一个区间时,如果这个区间的价值大于当前已选区间的最小者,那么就把它加入答案,将最小者加入候选部分,否则直接加入候选;删除时,如果在候选部分就直接删,否则需要取出候选部分的最大值加入答案。
不难发现两个 priority_queue
就可以完成上面所需的操作(对顶堆?),删除时直接维护信息进行懒删除即可,每次修改只会进行 \(O(1)\) 级别的操作,于是单次修改的时间复杂度为 \(O(\log n)\),总体时间复杂度为 \(O(n\log n)\).
#Code
1 |
|
#T2 游戏
#题意简述
给定有一个 \(2n(n\leq5\cdot10^5)\) 个点的环,同时给定 \(n\) 条额外的边(没有重复的端点),要求将整张图的所有点染为两种颜色,满足没有额外边两端颜色相同,在环上没有连续的三个人颜色相同。给出构造方案,若无可行的构造方案,输出 impossible
。
#大体思路
先来你考虑环上的约束条件,我们只需要保证 1 与 2 不同,3 与 4 不同……\(2n-1\) 与 \(2n\) 不同即可,于是我们只把 \(2i\) 与 \(2i-1(1\leq i\leq n)\) 相连即可,再考虑额外的 \(n\) 条边,发现每次最多也只会加入 \(2\) 个点,最终形成一个具有偶数个点的环,这样的图一定是一个二分图,所以直接黑白染色即可。时间复杂度 \(O(n)\).
#Code
1 | const int N = 2000010; |
#T3 字符串
#题意简述
给定 \(n(n\leq100)\) 个字符在字符串 \(S\) 中的出现次数 \(a_i(a_i\leq10^9)\),要求将这些字符用 0/1 进行编码,每个字符编码的长度不超过 \(l(l\leq30)\),问 \(S\) 在编码后的最小长度。
#大体思路
因为编码长度有限制,所以直接用哈夫曼树是不行的(实际上因为数据过水可以过 QnQ),但是可以借鉴哈夫曼树的思想,使用二叉树进行编码。
设 \(f_{i,j,k}\) 为当前处理了出现次数前 \(i\) 大的字符,在二叉树的第 \(j\) 层,还剩 \(k\) 个结点可用时的最小长度和,容易发现具有转移: \[ \begin{aligned} f_{i,j,k}&\to f_{i+1,j,k-1},\\ f_{i,j,k}&\to f_{i,j+1,k\times2}. \end{aligned} \] 然后直接转移即可,时间复杂度为 \(O(n^2l)\).
#Code
1 |
|
#T4 金色飞贼
巨大恶心的计算几何,暂且咕着。