暴露真实水平了,我该怎么办???
Day1
A
首先注意到面基顺序与答案无关,因为如果提前与某个人面基了,那可以让那个人一直与你走相同的路线,等到轮到他面基时再面基。
所以,我们就是要选一个位置,使得所有人(包括你自己)到这个位置的距离的最大值最小。这个位置可以是一个点,也可以是某条边上的某个位置。
对于在点上会合的情况,直接枚举即可。对于在边上的情况,先枚举一条边 ,那么在这条边上会存在 个分界点,每个分界点表示某个人从点 进入这条边更优,变为了从点 进入这条边更优。对于两个分界点间的情况,容易计算其答案。
时间复杂度 。
B
我们令 。设此时得到的原串为 ,新串为 。
定义合法括号前缀为一个由 和 组成的数列,且其前缀和总是 。
先考虑匹配怎么做,也就是说,我们需要检查是否存在一个合法括号前缀 ,使得 是 的子序列,且去掉 中的某个 后,剩下的部分等于 。
我们贪心地匹配。假如当前匹配了 的前 位和 的前 位,且括号前缀的总和是 。若 ,则下一位可以直接匹配。否则,若 或 ,那么令 即可。
如果 ,那么我们需要让 减少一些。我们找到最大的 使得 之和大于 ,并令 。这是对的,因为任意两个合法括号前缀交替拼接起来以后,仍然是合法括号前缀。
对于计数,将上面的 记入状态,然后直接转移即可。
时间复杂度 。
Day2
A
记 。
假如能找到两个集合 使得 ,那么令 中的元素为 , 中的元素为 ,其余元素为 ,这样就构造出了一组答案。
由于 ,根据鸽巢原理,总存在一个 使得有至少两个集合 满足 ,所以一定有解。
考虑分治。设 表示:我们要找一个 使得存在集合 满足 ,且保证 间有解。令 ,我们考虑求出有多少个 满足 。设这个数是 ,假如 ,说明 间一定有解;否则, 间一定有解。
现在我们需要处理 次询问,每次问 在某个区间内的 的个数。折半,设 ,开始时预处理 和 的所有子集和,并从小到大排序,每次询问时,设 ,有两种情况:,以及 。对两种情况分别双指针即可。
最后,我们需要对于分治找到的 ,求出两个集合。利用上面折半得到的信息不难求出。
时间复杂度 。代码实现。
B
只补了 分做法。
首先,对于两个点 ,若存在 这条边,那么 连通当且仅当 这条边被选中。
考虑找到一种构造询问的方式,使得对于任意两条不同的边 ,都存在一个询问满足 被包含在这个询问中,而 不被包含。如果总询问次数为 ,那么一条边 存在,当且仅当 与 在恰好 次询问中连通。
一种询问次数为 的构造:考虑二进制分组,对于每个 ,我们取出所有二进制下第 位为 的边询问;再取出所有二进制下第 位为 的边询问。
一种询问次数为 的构造:我们找到 个 popcount 恰好为 的 位二进制数,令 条边分别对应这些二进制数。每次只需询问第 位为 的所有二进制数对应的边即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现