Loading

NOIP模拟赛 #2

#1 不想理会。

A

给定 \(n\) 个点和 \(2n - 3\) 条边,这些边形成了一个凸 \(n\) 边形以及其三角剖分。你可以任意选择三个点,建立一个新的点以及其连接这三个点的边。最小化新建的点数,使得存在一种把最终的图拆分成两个边集无交的生成树的方案。通过交互来新建节点,并返回构造的方案。

\(3\le n\le 2\times 10^5\)

考虑新建一个点,此时点数为 \(n + 1\),边数为 \(2n\),已经是下界,考虑构造一种方案使得其划分为两棵生成树。可以每次选择一个度数为 \(2\) 的点,将其连接的两条边分别丢进两颗生成树,然后删掉这个点。直到最终只剩一个三角形时,新建一个点即可。

B

\(n\) 个点排成一排,选择若干个点使得相邻两个选择的点距离 \(\ge k\),输出最大化后的选的点的权值和。权值序列这样给出:初始 \(n\) 个点的权值都为 \(0\),有 \(m\) 次操作,每次令 \([l, r]\) 中的点权值加 \(1\)

\(1\le k\le n\le 10^{12}, \ 1\le m\le 2.5\times 10^5\)

这个是一定要 dp 的,但是点数过多难以处理。考虑一个点选择的条件,他要么是某一操作中的 \(l\),要么上一个选择的点与其相距 \(k\)。定义关键点为一个选择的点,满足其为某一次的 \(l\)

离散化,提取出所有关键点。设 \(f_i\)\([1, l_i - k]\) 中的点的答案,那么可以使用 \(f_i\) 来更新位置 \(l_i\),求解可以直接把 \(l_i - k + 1\) 一起离散化掉。考虑在模 \(k\) 同余系上建立线段树,所有非关键点的处理是容易的,只需要做区间加。

C

给定一棵树,有 \(m\) 个人,每个人的行动范围为树上点 \(p_i\) 的距离为 \(d_i\) 的邻域。一开始第一个人感染了病毒,当两个人 \(i, j\) 的行动范围都包含了点 \(x\),那么 \(i\) 会消耗 \(c_x\) 时间将病毒传染给 \(j\),求每个人最早感染病毒的时间。

\(1\le n, m\le 10^5\)

淀粉质优化建图,最短路。

D

交互题,你需要猜一棵树,每次可以询问交互库一个点到达一个集合中每个点的距离之和。需要满足询问次数不超过 \(8500\),询问的集合大小总和不超过 \(3\times 10^5\)

\(1\le n\le 1000\)

\(1\) 为根,询问出每个点的深度,一层一层处理,令 solve(A, B)\(B\) 中每个点从 \(A\) 中匹配一个父亲。

\(A\) 分为两个集合 \(A_1,A_2\),发现若两个点 \(x,y \in B\) 满足 \(ask(x, A_1) = ask(y, A_1)\) 则可以划分为一组。对于一个点 \(x\in B\),令 \(z\) 为其树上的父亲,应满足 \(ask(z, A_1) = ask(x, A_1) - |A_1|\),所以也可以把 \(A\) 中的点分成若干组。

\(A, B\) 分成的若干组应是一一对应的,可以分治下去,正确性不会证明。

  • 启示:随机化算法;分治思想。
posted @ 2024-10-29 16:15  Lgx_Q  阅读(24)  评论(0编辑  收藏  举报