专栏文章
依旧云斗集训
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min90yk4
- 此快照首次捕获于
- 2025/12/01 22:32 3 个月前
- 此快照最后确认于
- 2025/12/01 22:32 3 个月前
Day 1
T1
给定长度为 的两个数列 ,你可以花费 的代价从两个数列中取出一个数,该操作可以做任意多次。假设最终你一共取了 个数,其中从 中取的数的和为 ,从 中取的数的和为 ,求:一只老哥。
把 降序排序,显然对于一种方案取的是 的一段前缀和 的一段前缀。
枚举 ,设你从 里取了 个数,则从 里取了 个数,两者取 ,显然关于 单峰,三分即可,一只老哥。
T2
给定一个初始值域为 的可重集 ,可以进行如下操作若干次:
- 选择一个(可以为空的)子集 , 中元素不可重。
- 从 中删掉 (重复元素只删一个)。
- 把 放进 。
求最少进行多少次能使 。给定 的方式是对于 ,每个 在 中有 个。
正序递推是 的,不可做,考虑倒序。
倒着找到最后一个 的位置,如果想让其属于 ,则至少花费一次,且前面的每个数都得取出来一次。
于是我们继续向前,设 表示到当前为止的答案,则对于 来说,如果 ,那最后需要补到 ,所以 就结了,线性。
T3
数轴上有 个点,有 次加点操作,每个点的移动速度是 单位长度每秒。每次加点操作后,输出所有点间距 的最小时间。一只老哥。
考虑任意两点之间的最优走法一定是相向而行,并且最终的相对位置关系一定与初始时无异,所以对于答案 来说,必然有:
移项得:
用线段树维护 ,合并时更新答案即可。
可以标记永久化,也可以直接区间加 tag,一只老哥。
T4
待补。
Day 2
T1
给定长为 的数列 ,找长度最小的区间 ,满足在 中 没有重复的数。
显然可以双指针,找到最大的 ,该前提下找到最小的 ,然后让 逐渐减小, 对应逐渐增大,线性。
T2
给定长为 的数列 ,选择一个区间 区间加上 ,求 的最长上升子序列。一只老哥。
假设 为正,则取得区间显然最优是一个后缀,而 为负的情况显然可以等价为 为正。
则我们算前缀的 LIS,后缀的 LIS,枚举一下分界点在哪里就好了,一只老哥。
T3
这我怎么形式化题意??你有 和 的乐高积木若干,你需要搭一个 的一堵墙,有多少种情况是这堵墙是锁死的。
sol
显然锁不死的情况是这堵墙能够被纵向分割,所以记 表示 且锁死的情况数, 表示 且锁不死的情况数, 表示斐波那契数列的第 项,则:
sol
考虑锁死的充要条件,显然是每一条接缝处都得有长为 的积木连接,于是设状态 表示第 条接缝有 个长为 的积木连接,则:
正解
平衡复杂度即可做到 。
T4
待补。
Day 3
T1
给定长度为 的数列 ,以及一个折扣系数 。把 中的元素分成若干组,用集合 表示。
- 若 ,则令 中最小的元素变为 。
- 若 ,则令 中元素变为原来的 倍。
你需要最小化分组后所有组内元素和。
如果你想要免费那一档,那分的组的大小显然不可能超过 ,不然多余的丢给折扣更优。
然后注意到免费那一档一定是选值域上连续的三个数,微扰即证。
所以排个序后 dp 即可,状态转移方程为:
一只老哥,瓶颈在于排序。
T2
Lottery
T3
给定平面内 个点,问有多少个点对 满足:两只老哥。
考虑 cdq,把所有的点的第二维从 劈开,则对于上面的点来说,其所能对应的下半区间的点一定是当前的前缀 ,于是下半单调栈,树状数组维护点个数即可。
主定理分析时间复杂度两只老哥。
T4
待补。
Day 4
T1
给定长为 的排列 ,定义二元函数 的定义域满足 ,则:取 前 小的和。
因为 ,而直接取 就一定 ,所以所有的 一定都小于 。
若 ,则 或者 。
所以原排列直接向前扫 个,值域与位置对调后再扫一遍就做完了。
用
nth_element 是 的,用优先队列还得带个老哥。T2
有 个形如 的限制,判断是否存在一个满足条件的数列。
转成前缀异或,然后二进制拆分。
用扩展域并查集维护相对关系即可,两只老哥。
T3
给定一个长为 的环,第 个位置上有数 。有多少种分割方案,满足分割出来的每一段的按位与都不为 。一只老哥。
考虑破环为链,直接计算怎么做。
对于单次 dp,可以做到 预处理出 bitand 的 st 表。dp 计算每个位置时需要知道最远可以与到哪个位置,所以需要一个二分,然后前缀和优化即可做到 。
如何不重不漏的计算所有情况?可以考虑每次算完之后,直接 ,然后让数列长度缩 ,每次缩完后直接暴力 dp 就是 的。
这时你注意到整个 dp 实际上仅关心 的取值,而 的更新依赖于 ,所以不同的 仅有 个,我们只需要在 改变的时候进行 dp 即可做到 。
最后你考虑每次 dp 的时候都求一遍 st 表是没有必要的,因为我们仅会改变 的值。又发现每次求值的二分也是没有必要的,对于那些二分出来的界大于 的位置,由于这些数根本不会变,所以一次二分即可。对于那些界正好是 的位置,我们只需要在更新的时候判断一下还能不能与到 即可,于是时间复杂度 。
T4
是个好题。
Day 5
T1
给定 ,有长为 的数列 ,与长为 的数列 。从 中取出尽可能多的没有交的递增子序列,满足相邻两项差值 ,且最小值 ,且最大值 。记上述问题答案为 ,则从 中取出 个数最小是多少。
首先是一些观察,取出来的 显然是最小的部分,所以排个序。
然后考虑怎么做,我们二分答案 ,考虑如何验证,发现一定是 个位置一起向前跳,显然跳的越远越好,这个过程等价于从 开始跳最接近 的点,然后把这个点从 中删掉。
于是二分答案是没有必要的,直接把 丢进
set 中维护然后暴力删点即可,一只老哥。T2
给定长为 的数列 ,求该数列的极长区间 ,满足存在 且 , 内的所有 。输出最长长度。
鉴定为典完了。
直接差分取绝对值,然后从差分数组中找到最长的 不为 的区间即是答案,用你喜欢的数据结构维护即可,两只老哥(也有说用 st 表是一只老哥的)。
T3
好题。
给定长为 的 数列,你最多可交换 对位置,要求最后相邻两个 的间隔不能 ,特别的,我们把位置 与位置 钦定为 。
暴力配对是不可做题,考虑怎么转化题意。
显然你不会交换 或者 ,你也不会交换同一个点两次,所以假设你交换了 对点,则等价于对这个数列进行如下操作:
- 选择 个位置从 ;
- 选择 个位置从 。
这个东西看起来就很可以 dp 的样子,所以我们开始设状态。设 表示前 个位置,一共走了 个位置,其中走了 个 的位置的可行性,转移是随便转移的,不细想的话大概是 的。
优化啊优化,dp 有一个非常经典的优化就是把可行性 dp 转化成最优化 dp,即把 dp 的某一维状态丢进答案中进行转移。
由于我们想要的时间复杂度应该是 的,而现在的状态数是 的,我们显然要考虑把某一个 的维度丢进答案,应该是丢哪个都可以,感觉把第一维丢掉是比较自然的,所以设状态 表示走了 个位置,其中有 个位置 ,所能走到的最远距离。
预处理出每个位置 后距离 以内最远的 或者 ,分别记为 和 ,则转移是 naive 的:
最后对于每个状态判断一下是不是满足条件就做完了,转移 ,则总时间复杂度就是 的。
T4
待补。
Day 10
T1
给定集合 ,你可以进行如下操作若干次:
- 选择 ,把 放进 中;
- 选择 ,把 放进 中。
保证 中初始时的元素 ,你需要对于 中的每个数判断最终其是否可以通过若干次操作使其进入 中。
挺好的题。
考虑 ,由于这两种位运算互有分配律,所以有:
那么我们可以先跑出仅通过 能够得到的数,再跑出通过 能够得到的数。
对于前者,我们考虑高位前缀和的过程,显然把一个子集内的所有数都或起来一定是不劣的,所以我们记 表示把 内的所有数与起来所得到的数是什么,最终只需要判断 等不等于 即可。
把 取反后后者就变成了前者,所以你就做完了这一题,时间复杂度 。
T2
不可做题
T3
给定一棵 个节点的树,根节点为 ,每个点有点权,每次询问给定 ,需要从该节点走向一个点权大于等于 且最小的儿子,你需要输出最终在哪里不能走了。可以对点权进行修改。两只老哥。
这真是何意味题目。
考虑这是一条链怎么做,显然二分一下,限一下下界与上界就能知道最远跳到哪里了。
那,直接剖,就是 的了啊。
何意味?
T4
定义一个数列是好的当且仅当:
- 相邻两个数的差的绝对值等于 。
- 中间的数大于等于相邻两个数的算数平均数。
给定长为 的数列 和 ,每次你可选择 的一段好的字串,假设其为 ,将其删掉,你得到 的价值。你可进行若干次这样的操作,不要求最终把数列删干净,最大化你能得到的价值。, 可能 。
这为什么放 T4?
考虑区间 dp,设状态 表示把 删掉得到的最大价值,所有的区间都求完之后再跑一个 的 dp 就是答案。
你考虑什么是个好的串,显然是一个单峰,且相邻两个相差 的段。
除了 这样的转移外,还需要统计一个把 放到一起相消的情况。由于好的串是单调递增的,所以你可以额外开两个数组辅助转移,对于一个位置 ,你只需要知道值为 的位置 ,显然这样的点对关系是 对,你只需要对于每个 和每个 都求出对应的最优转移即可。
时间复杂度 。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...