csacademy round-38 简要题解

Shoe Pairs

模拟即可


Attack and Speed

模拟即可


Bounded Difference

对于一个满足 \(|A_i-A_{i+1}|\leq K\)\(i\) ,将 \(i,\ i+1,\ i+2\) 标记为特殊点

不难发现特殊点个数过多显然无解,否则对每个特殊点 \(x\) ,枚举剩下 \(n-1\) 个元素 \(y\) ,判定交换 \((x,\ y)\) 是否合法即可


Path Union

现在有一个根节点 \(1\) 深度为 \(0\) ,深度为 \(N\) 的满二叉树,非叶子节点 \(k\) 的两个儿子是 \(2k,\ 2k+1\)

对于每个 \(1\leq i\leq N\) ,你需要在深度为 \(i\) 的点中选 \(A_i\) 个点。对于一个被选择的点 \(u\) ,将根节点 \(1\)\(u\) 这条路径上所有的边标记。你需要找到一组方案,最大化选择完成后,被标记的边的数量

  • \(N\leq60\)
  • \(0\leq A_i\leq 2^i\)
  • \(\displaystyle\sum_{i=1}^NA_i\leq10^5\)

做法一:

不难猜到一个结论,记 \(B_i=\displaystyle\sum_{j=i}^NA_j\) ,则答案等于 \(\displaystyle\sum_{i=1}^N\min(2^i,\ B_i)\) 。大概可以感性理解一下

既然如此,我们从小到大考虑 \(i\) ,往满二叉树中依次插入 \(A_i\) 个深度为 \(i\) 的点。在满二叉树上 dfs,我们决定当前点 \(k\) 向左 \(ls\) 或向右 \(rs\) 的依据是,记 \(ls\) 子树中最浅的深度 \(j_{ls}\) 使得存在至少一条 \(ls\) 子树中深度为 \(j\) 的点向父亲连的边未被标记,对 \(rs\) 同理求得 \(j_{rs}\) ,往 \(j\) 较小的一侧走即可

实现时可以用 long long 维护每个点子树的 \(j\) ,用 hashmap 存

时间复杂度 \(O(n\displaystyle\sum A_i)\) ,空间复杂度 \(O(n\displaystyle\sum A_i)\) ,大概需要卡常 /kk

做法二:

https://csacademy.com/submission/327744/

沿用做法一的思路,我们每选一个点,必定会将整棵树深度最浅的未被标记的边之一 \(p\) 标记掉,而 \(p\) 的大小是 \(O(\displaystyle\sum A_i)\) 级别的

因此按 \(i\) 递增插入每个点 \(u\) ,可以暴力枚举出 \(u\) 对应的 \(p\) ,在 \(p\) 的子树中随意选择一个深度为 \(i\) 的点作为 \(u\) 即可

时间复杂度可以做到 \(O(\displaystyle\sum A_i)\)

做法三:

找出最大的 \(i\) 满足 \(B_i\ge2^i\) ,深度为 \(i\) 的所有点向父亲连的边均会被标记,且 \(i\) 是满足该条件的最大值

深度小于 \(i\) 的点不用考虑,将 \(A_i\) 填给第 \(i\) 层的后缀,接着考虑深度大于 \(i\) 的部分

为了保证深度为 \(i\) 的点向其父亲连的边都被标记,先对于每个深度为 \(i\) 的节点的左儿子,在其子树中匹配一个深度大于 \(i\) 的点,然后再给每个右儿子匹配

由于 \(i\) 是最大的满足 \(B_i\ge2^i\) 的,这样匹配可以使用掉所有深度大于 \(i\) 的点

时间复杂度 \(O(n)\)


Tree Antichain (Hard)

给定一棵 \(N\) 个点的树,找到一个 \(1,\ 2,\ \cdots,\ N\) 的排列 \(A_i\) ,满足 \(\forall\ 1\leq i<N,\ \exists\ A_i\)\(A_{i+1}\) 在树上没有边。找到字典序最小的一组解

\(T\leq10^4;\ N\leq10^5\)

将找排列看做二分图匹配

对于排列 \(A_1,\ A_2,\ \cdots,\ A_n\) ,在开头之前添加一个起点,在末尾之后添加一个终点,对于相邻的两个元素,在其间连一条边

左部 \(N+1\) 个点,表示 \(1,\ 2,\ \cdots,\ N\) 和起点;右部 \(N+1\) 个点,表示 \(1,\ 2,\ \cdots\ N\) 和终点

左部点 \(i_L\) 与右部点 \(j_R\) 不能连边当且仅当 \((i,\ j)\) 是树上的一条边

得到匹配后,从起点 dfs 一遍即可找到对应排列

用 Hall 定理判定是否存在完美匹配,可以得到,对于任意一个左部点点集 \(S\) ,存在 \(|S|+|\)每个 \(u\in S\) 的出边的交\(|\leq N+1\)

观察一下可以发现,顺序确定排列的每个点,当前森林为删掉所有已经确定的点及其出边,不存在完美匹配当且仅当,当前只有一个连通块,且当前树是一个菊花图

接着观察一下,删掉点 \(u\) 后不存在完美匹配,当且仅当 当前森林仅有 \(u\) 单独形成的连通块和一个菊花图,或是 当前森林仅有一个连通块 \(u\) 出度为 \(1\) ,且 \(u\) 唯一出边 \(v\) 度数为 \(2\) ,删掉点 \(u\) 及其出边后整个连通块存在恰好一个度数大于 \(1\) 的点

\(set\) 维护没有被选过的点的集合,模拟一下即可,时间复杂度 \(O(n\log n)\)

p.s.: 如果将树黑白染色,当前森林不合法当且仅当连通块个数为 \(1\) 且至少有一种颜色在当前森林中只有恰好一个对应颜色的点,写着很简单


Parallel Lines

给定平面上 \(n\) 个点,找到最小的 \(k\) 使得能用恰好 \(k\) 条相互平行的直线覆盖所有点,即每个点恰好在一条直线上。保证答案的 \(k\leq400\)

  • \(T\leq10\)
  • \(n\leq3\times10^4\)

随机化

考虑随机两个点 \(P,\ Q\) ,以直线 \(PQ\) 作为平行线之一暴力求一遍答案

不难发现对于答案的方案,至少有一条直线覆盖了不少于 \(\frac nk\) 个点,故这样做的正确率至少是 \(\frac 1{k^2}\)

实际跑起来正确率蛮高的,不会证 /kk

需要对 \(n\) 较小的情况特殊处理(如 \(n\leq500\) )以保证复杂度

posted @ 2020-10-17 08:33  cnJuanzhang  阅读(146)  评论(0编辑  收藏  举报